C语言基础向——二级总结

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;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值