之前在复习数据库和Java,现在也在开始启动复习C语言,我准备写个专题,关于自己见到的关于C的一些题目,方便自己迎接考试。

题目:假设今天是星期日 则a的b次方天是星期几

这道题目的本质就是求除以7的余数是多少,如果直接算出a的b次方,有可能会超出C的存储范围,所以为了避免这种情况,要每计算一次,就要取一下余数

#include<stdio.h>

int main(){
	int a;
	int b;
	int i;
	int temp = 1;
	scanf("%d%d",&a,&b); 
    //关键代码
	for(i=1;i<=b;i++){
		temp  = temp*a;
		temp = temp%7;
	}
	switch(temp){
		case 0:printf("sunday");break;
		case 1:printf("monday");break;
		case 2:printf("tuesday");break;
		case 3:printf("wednesday");break;
		case 4:printf("thursday");break;
		case 5:printf("friday");break;
		case 6:printf("saturday");break;			
	}
	
	return 0;
} 

易出错点如下面的代码所示,刚开始,我直接在a上连乘,刚写完我就意识到自己写错了,又加一个变量temp。 

for(i=1;i<=b;i++){
		a = a*a;
		a= a%7;
	}

题目:分数a/b换成小数之后,求第n为小数,0<a<b<100,1<=n<=10000

这道题目我刚开始的思路是这样的,比如1/3,结果为1.3333333......,我先让结果乘以10,然后变成13,然后取%10,也就是取最后一位数字,也就找到了第一位小数数字。这种方法思路正确,操作性也行,但是会超出数据类型的存储范围,导致解决方法不成功,自己写的方法如下:

错误解法!

#include<stdio.h>
int main(){
	int a;
	int b;
	int n;
	double result;
	int x;
	int mul;
	scanf("%d%d%d",&a,&b,&n);
	result = (double)a/(double)b;
	mul = pow(10,n);
	x = (int)(result*mul)%10;
	printf("%d\n",x);
}

最后还是看了答案:答案的意思就是像我们平时计算1/3一样,先列出除法竖式,如下图所示:

#include<stdio.h>
int main(){
	int a;
	int b;
	int n;

	scanf("%d%d%d",&a,&b,&n);
	
	int i;
	int t;
	//关键代码
	for(i=0;i<n;i++){
		a = a*10;
		t = a/b;
		a = a%b;
	}
	printf("%d",t);
	
}

 

题目:护室每小时测量病人的正常血压 若收缩压在90到140之间 舒张压在60到90之间为正常,现给出某个病人若干次测量的血压,计算保持正常血压的最大连续正常次数 

#include<stdio.h>

int main(){
	 
	int n;//输入血压个数 
	int i;
	int x,y;
	int sum = 0;
	int max = -1;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d%d",&x,&y);
        //关键代码段
		if(x>=90&&x<=140&&y>=60&&y<=90){
			sum++;
			if(sum>max){
				max = sum;
			}
		}else{
			sum = 0;//重新计数 
		}
	}
	printf("%d",max); 
	 
	return 0;
} 


题目:每个月月初妈妈给静静300元,每个月静静会预算这个月的花销,静静每个月月末可以将剩的钱多余100或者正好等于100的存在妈妈手中
例如:11月初静静手中还有83元,静静预计11月的花费为180元,那么他就会给妈妈200元,自己在这个月月末只有3元 

输入12行数据,输出只包含一个整数,若出现某个月钱不够用 输出-x x表示地几个月 否则输出年末还有多少钱 

#include<stdio.h>

int main(){
	int month = 1;//月份
	int money_mother = 0 ;//妈妈手里面的钱 
	int money_my = 0;//自己手里面的钱
	int budget = 0;//每个月的预算
	while(month<=12){
		scanf("%d",&budget);
		money_my =  money_my +  (300-budget);
		if(money_my<0){
			printf("-%d",month);
			break;
		}else{
			if(money_my>100){
				money_mother = money_mother + (money_my/100)*100;//多余的钱给妈妈 
				money_my = money_my - (money_my/100)*100;//减去给妈妈的钱 
			}
		}
		month++;//每月递增 
	} 
	if(money_my>=0){	
		printf("%.0lf",(money_mother*1.2 + money_my));//显示占位符有错误!!!!导致自己尝试了半天 
	}
	
	return 0;
} 

在处理这个问题的时候,我的思路都是正确的,代码也都是这正确的,但是在最后一个步骤中,printf("%.0lf",(money_mother*1.2 + money_my)),我没有想到money_mother*1.2 + money_my这个值是double类型的,而我写成了int类型的,导致我DEBUG了半天,始终找不出哪地方出错了,最后一点一点的看代码才想起来。

题目:数字反转。比如123 变为 321,-380 变为 -83

 这道题目还算简单,常规思路,但是由于自己对于C不熟练,忘了很多知识,结果导致很多错误。具体代码如下:

#include<stdio.h>

int main(){
	int fanzhuan(int n);//声明反转函数 
	
	int n;//原始数字
	int res;//反转数字
	scanf("%d",&n);
	if(n<0){
		res = fanzhuan(-1*n);//
		printf("%d\n",-res);
	}else{
		res = fanzhuan(n);
		printf("%d\n",res);
	}
	
	return 0;
} 

int fanzhuan(int n){
	int res = 0;
	int temp;
	if(n==0){
		return 0;
	}
	while(n!=0){
		temp = n%10;
		res = res*10 + temp;
		n = n/10;
	}
	return res; 
}

从这个程序暴露的问题:

一:-n与-1*n的结果一样

二:在函数中,一定要写返回值,不能考虑完逻辑之后就直接运行

三:声明变量时,一定要考虑要不要赋予初始值,赋予的初始值是0还是1或者其他值

四:定义的函数名与调用函数名一定要一致!!如果不一致,会发生以下错误:

这系列的每一篇博客说的题目不多,就五道题,虽然只有5道题目,但是,这可是我从三四十道题目中抽取出来我认为的好题,希望对小伙伴们有帮助。 

更多推荐

C语言经典100题(一)