今天继续刷题,我总结了不少方法,希望能对您有所帮助!:
目录
一、内容介绍:
二、指针习题:
2.1 有关分割函数
①基础部分:分割函数的使用
②深化学习:用c语言实现strtok函数
plan A:
plan B:
③指针知识补充:指针与二维函数
2.2 选择题
1.
2.
3.
三、函数习题
3.1 有关统计个数
①题目实例
②具体算法
3.2 分解质因数
四、总结:
本次做题总结方法如下:
1.指针函数混合题:strtok函数的具体实现
2.算法:统计字母个数
3.质因数分解(学会阅题)
4.指针知识补充:指针与二维函数
5.指针选择题(易错混淆)
题目:
在主函数中确定字符串以及想进行的分割符号,实现字符串的分割。
输入:暂无
输出:
split
string
to
many
single
part
ok
代码如下:
#include
#include
#define SIZE 10
int my_split(char *p[SIZE], char str[], char const *sep)//传入要实现分割的部分
{
int num = 0;
for (p[num] = strtok(str, sep); p[num] != NULL; p[++num] = strtok(NULL, sep));
return num; // 返回被分割成单独部分的个数
}
int main() {
char line[] = "split@string/to#many single,part]ok";
char *p[SIZE];//存储分割后得到的子字符串
char const *token = " ,/@#]";//用指针才能够实现跨函数操作
int num = my_split(p, line, token);
for (int i = 0; i < num; i++) {
printf("%s\n", p[i]);
}
return 0;
}
知识点总结:
1.这里比较需要注意的指针知识点在于,一维指针变量的使用(如图):
即*p[SIZE]的作用:储存每次被分割下来的子字符串
2.接下来就是strtok函数的使用,其作用是根据分割符号对字符串进行分割
标题即题目哈
输入:即将被分割的字符串以及分割标志
输出:分割出的子串
这里提供两种方法:
char **split(char *str, char *splitor)
{
char *temp; // 保存临时字符串
int n = 0; // 字符串个数
char **strs;
char *tempStr;
tempStr = malloc(sizeof(char) * strlen(str) + 1);
mallocJudge(tempStr);//这个函数麻烦大家自己写一下哈,判断一下有没有申请成功
strcpy(tempStr, str);
temp = strtok(tempStr, splitor);
while (temp)
{
n++;
temp = strtok(NULL, splitor);
}
if (n == 0)return NULL;
strs = malloc(sizeof(char *) * n);
mallocJudge(strs);
free(tempStr);
temp = strtok(str, splitor);
for (int i = 0; temp; ++i)
{
strs[i] = malloc(sizeof(char) * strlen(temp) + 1);
mallocJudge(strs[i]);
strcpy(strs[i], temp);
temp = strtok(NULL, splitor);
}
return strs;
}
char **split(char *str, char *splitor)
{
char **q;//指向指针数组空间的二维指针变量
int numberOfSplitor = 0;
int lengthOfStr = strlen(str);
int startIndex = -1, endIndex = -1;
int subStrNo = 0;
for (int i = 0; i < lengthOfStr; ++i)
{
if (str[i] == *splitor)numberOfSplitor++;
}
q = malloc(sizeof(char *) * (numberOfSplitor + 1));
mallocJudge(q);
for (int i = 0; i <= lengthOfStr; ++i)
{
if (startIndex == -1 && str[i] == *splitor)
{
continue;
}
if (str[i] != *splitor && startIndex == -1)
{
startIndex = i;
endIndex = i;
continue;
}
if (str[i] != *splitor && endIndex >= startIndex)
{
endIndex = i;
}
if ((str[i] == *splitor || str[i] == '\0') && endIndex >= startIndex)
{
int tempLength = (endIndex - startIndex + 2);
q[subStrNo] = malloc(sizeof(char) * tempLength);
mallocJudge(q[subStrNo]);
for (int j = 0; j < tempLength - 1; ++j)
{
q[subStrNo][j] = str[j + startIndex];
}
if (q[subStrNo][tempLength - 1] != '\0')q[subStrNo][tempLength - 1] = '\0';
startIndex = endIndex = -1;
subStrNo++;
}
}
return q;
}
该知识的分享更有利于对题目的理解
分享3个易错选择题:
1.
参考解析:
&a[2]相当于a+2,p相当于a
2.
参考解析:
定义指针的时候,要加*,然后这个时候代表的还是指针,之后再加*,代表的就是修改里面的值
3.
参考解析:
a是数组名,不能自加
题目描述
笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!
这种方法的具体描述如下:假设 maxnmaxn 是单词中出现次数最多的字母的出现次数,minnminn 是单词中出现次数最少的字母的出现次数,如果 maxn−minnmaxn−minn 是一个质数,那么笨小猴就认为这是个 Lucky Word,这样的单词很可能就是正确的答案。
输入格式
一个单词,其中只可能出现小写字母,并且长度小于 100100。
输出格式
共两行,第一行是一个字符串,假设输入的的单词是 Lucky Word,那么输出 Lucky Word
,否则输出 No Answer
;
第二行是一个整数,如果输入单词是 Lucky Word
,输出 maxn−minnmaxn−minn 的值,否则输出 00。
输入输出样例
error
Lucky Word
2
代码如下:
#include
#include
#include
void st(int n)
{
if(n==0||n==1)
{
printf("No Answer\n");
printf("0");
return;
}
int t=sqrt(n);
for(int i=2;i<=t;i++)
{
if(n%i==0)
{
printf("No Answer\n");
printf("0");
return;
}
}
printf("Lucky Word\n");
printf("%d",n);
return;
}
int main()
{
char a[100];
scanf("%s",a);
char b[100];
strcpy(b,a);
int max=0,min=100,sum=0;
for(int i=0;a[i]!='\0';i++)
{
sum=0;
for(int j=0;b[j]!='\0';j++)
{
if(a[i]==b[j])
{
sum++;
if(sum>max)
max=sum;
}
}
if(sum
其中:这部分可以用算法取代
if(a[i]==b[j])
{
sum++;
if(sum>max)
max=sum;
}
}
if(sum
代替算法:
#include
#include
#include
void st(int n)
{
if(n==0||n==1)
{
printf("No Answer\n");
printf("0");
return;
}
int t=sqrt(n);
for(int i=2;i<=t;i++)
{
if(n%i==0)
{
printf("No Answer\n");
printf("0");
return;
}
}
printf("Lucky Word\n");
printf("%d",n);
return;
}
int max(int x,int y)
{
return x>y?x:y;
}
int min(int x,int y)
{
return x
题目描述
已知正整数 n 是两个不同的质数的乘积,试求出两者中较大的那个质数。
输入格式
输入一个正整数 n。
输出格式
输出一个正整数 p,即较大的那个质数。
输入输出样例
21
7
代码如下:
void st(int n)
{
int i,j;
// while(1)//没用
// {
for(int i=2;i<=n;i++)//从2开始
{
if((n%i==0))
{
j=n/i;
break;//只能结束一层循环,你加这个while成死循环了
}
}
// }
// if(p(i)&&p(j))
// {
// if(i>j)
// printf("%d",i);
// else
// printf("%d",j);
// }//不用判断,直接输出,这个原理和埃筛法比较像
printf("%d",j);
}
int main()
{
int n;
scanf("%d",&n);
st(n);
return 0;
}
注意:!!
1,我的指针好烂o(╥﹏╥)o
2,但是进步不少,还要注意认真看题的问题
3,祝您(*^▽^*)开心!!!拜拜了~~~哈哈