1.前言
最近考了计算机二级C,我在做完大约100道操作题后对C语言有了新的收获,小部分的题目还是有做的价值。二级C操作题的难度大约是力扣简单题的难度(大部分题目甚至更简单),个人认为,对C语言初学者来说掌握这些还是有很大意义的。
2.例题
1.累加累乘问题
初学循化的人做这类题目可能还是有一定难度,不过这也是一种很好的锻炼。
这题关键就在于又要累加又要累乘,如何使用一个循化就完成这两个要求。不妨先自己思考一下。
可以注意到,后一项比前一项每次变化x/n 倍,所以我们可以定义一个变量,保存其初始值,然后每次随循化变化x/n 倍,再用另一个变量累加它们的值就行了。答案见下文。
double fun(double x , int n)
{
int i;
double f=1.0,h=x;
double s=1;
s=s+h/f;
for (i=2;i<=n;i++)
{
f=f*i;
h=h*x;
s=s+h/f;
}
return (s);
}
2.去星号问题
这题可以使用双指针加覆盖的方法做。
使用两个指针,分别为左指针和右指针,都指向第一个找到的字母,然后开始循化判断右指针对应元素是否为*,是,则右移右指针直至找到不为*的字母,再将右指针对应的字母赋值给左指针对应的字符,也就是用右指针对应的元素,覆盖左指针对应的元素。此时左指针之前对应的元素已经被覆盖,不知道是哪一个了,但不影响结果。左指针再加一。循化移动右指针至不为*号的字母,直至右指针遇到字符串结束符,结束循化。再将左指针对应元素赋值为‘\0’ 。
void fun( char *a )
{
int right=0,left;
while(a[right]=='*') //找到第一个不为*号的字母
right++;
left=right;
while(a[right]!='\0'){ // 实现非*字符前移
if(a[right]!='*') a[left++]=a[right];
right++;
}
a[left]='\0';
}
3.字符后移问题
这题,我们可以先用一个变量保存第一个字母,然后再用循化将第一个字符覆盖,即从第二个字符开始往前移动一个字符。这样字符串最后会空出一个字符的位置,将之前保存的字符放到最后。如此循化m次,就能得到我们想要的结果。见代码:
void fun(char *w, int m) /* 可调用fun1函数左移字符 */
{
int i=0,x,j;
char ch;
for(j=0;w[j];j++) i++;
for(x=0;x<m;x++){
ch=w[0];
for(j=1;j<i;j++) {
w[j-1]=w[j];
}
w[i-1]=ch;
}
}
4.字符串转整数
这题使用一个循化就能做出来。我们定义一个长整型变量,并初始化为0,再定义一个指针指向字符串首字母。每循化一次乘以10并加上指针对应字符串的一个字符对应的数字值。之后指针加一。直至循化遍历完字符串所有字符,我们就能得到字符串对应数字。
另外值得注意的一点是,数组字符转成对应的数字需要减去48,或者减去字符0(两者的本质是一样的,0对应的ascll码值就是48)。
long fun( char *s ){
int i,n;
long a,r;
a=0;
r=0;
n=strlen(s);
for(i=0;i<n;i++){
a=*(s+i)-48;
r=r*10+a;
}
return r;
}
5.取得数字的各个位——四玫瑰数
这题的关键是如何取得一个数字的各个位,通常我们取个位的思路是用10去取余。但我们如何取得其他位。换一种思路,我们可以把其它位也变为个位,这样就简单了。具体的做法是再取了个位之后,将原来的数除以10,这样原来的十位就变成了个位。循化下去,我们就能取到一个数的各个位。见代码:
int fun(int n, int result[]){
int i,j,k=0,s;
for(i=1000;i<n;i++){
s=0;j=i;
while(j>0){
s+=(j%10)*(j%10)*(j%10)*(j%10);
j=j/10;
}
if (s==i) result[k++]=i;
}
return k;
}