中国大学MOOC 浙江大学《程序设计入门——C语言》第5周:循环控制 测验与作业

 

1.素数和(5分)

题目内容:

我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。

现在,给定两个整数n和m,0

 

输入格式:

两个整数,第一个表示n,第二个表示m。

 

输出格式:

一个整数,表示第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。

 

输入样例:

2 4

 

输出样例:

15

时间限制:500ms内存限制:32000kb

#include
int main()
{
	int count =0,sum=0;                //定义计数器count,以及累加器(素数和)sum
	int isPrime=1;                     //先拟定每个数都是素数
	int m,n,i,j;                       //m,n是范围,i,j是for循环里的变量名称
	scanf("%d %d",&n,&m);    
	if(n>=0&&m<=200&&n<=m){            //题目m,n的范围
		for(i=2;;i++){             //从整数2开始不停的判断直到满足题意
			isPrime=1;         //一定要在第二个for开始之前给isPrime赋值,否则会死循环
			for(j=2;j=n&&count<=m&&isPrime){    //当在题目范围内了(n),计算素数和
					sum+=i; 
				}
			if(count==m) {                         //为了节省运行时间使用goto,直接前往程序指定位置
					goto end;
				}
			}
		}
	}
end:
	printf("%d",sum);
	return 0;
}

如果有更简便,或者运用其它知识点写出的程序,都会在下方更新、补充。希望大家都能自己写一遍程序,这样更易理解。

2020/4/8日:优化程序(isPrime==1) -> (isPrime)

心路历程:

由于我本身也是从零学起,这题卡了很久,第一次写的程序实在太复杂,用了'sum1+sum2=sum'这种思路,导致程序超时,提交不成功。后来我改变思路,回想老师在本节课里讲的内容,也就是对比课上素数的几个例子,稍加修改,便成了以上的代码,结合老师推荐的goto,进一步缩短运行时间。

在写这个程序的时候,我把isPrime这个变量的放置问题也足足困扰了我很久,起初,我只在开头声明变量的时候,声明isPrime=1,在for循环中不再提及,导致程序无法运行结束,形成死循环,经过调试,发现当有一个整数到了以下阶段时

if(i%j==0){          //不是?isPrime=0,跳出当前循环
isPrime=0;
break;
}

isPrime=0了,然后break语句使得程序跳出最内层的for循环语句,那么,问题就来了!!!

for(i=2;;i++){
    for(j=2;j

如果没有在第一个for循环语句内声明isPrime=1,那isPrime就始终、永远=0了,导致程序永远结束不了,这也就是为什么要在这个位置声明的原因。(真的困扰了一个晚上,第二天起来就想出来了,看来还是应该有充足的睡眠啊)

 


 

2.念整数(5分)

题目内容:

你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。

如输入1234,则输出:

yi er san si

注意,每个字的拼音之间有一个空格,但是最后的字后面没有空格。当遇到负数时,在输出的开头加上“fu”,如-2341输出为:

fu er san si yi

 

输入格式:

一个整数,范围是[-100000,100000]。

 

输出格式:

表示这个整数的每一位数字的汉语拼音,每一位数字的拼音之间以空格分隔,末尾没有空格。

 

输入样例:

-30

 

输出样例:

fu san ling

时间限制:500ms内存限制:32000kb

#include
#include                //要用pow函数(x的n次方)
int main()
{
	int x,y;                //x:输入的数,y:用来获取最高位
	scanf("%d",&x);         
	int t;
	int count;              //计数器
	if(x<0){                //如果输入的数是负数,变正
		t=-x;
	}
	else{
		t=x;
	}
	do{                     //计算输入数字的位数
		t=t/10;
		count++;
	}while(t>0);
	y=pow(10,cnt-1);        //得到y,接下去就可以用来获得最高位数字
	if(x<0){        //注意!!t现在已经等于0了所以为了便捷,直接ctrl-c and ctrl-v并填上fu(负数前多输出个“fu ”)
		t=-x;
		printf("fu ");
	}
	else{
		t=x;
	}
	do{
		switch(t/y){                        //switch case语句这节课教的
		    case 0:printf("ling");break;
         	    case 1:printf("yi");break;
         	    case 2:printf("er");break;
         	    case 3:printf("san");break;
         	    case 4:printf("si");break;
         	    case 5:printf("wu");break;
         	    case 6:printf("liu");break;
         	    case 7:printf("qi");break;
         	    case 8:printf("ba");break;
         	    case 9:printf("jiu");break;
		}
		if(y>9){                //这样最后一个拼音后没有空格
			printf(" ");
			
		}
		t=t%y;            //去掉最高位
		y=y/10;           //减少一位
	}while(y>0);
	return 0;
}

所用语句函数:

  • do while语句
  • if语句
  • swichcase语句
  • pow函数

 

 

心路历程:

首先头文件要加上math.h因为pow函数要用,第二个我考虑到的问题在于,如何处理负数,于是想到了把输入的值再赋值给一个变量t,将负数变为正数,题目要求负数的符号要用fu来表示,于是我就在这个if语句中添加上了一句printf("fu "),这样做其实包含着问题,我们等会再说。

if(x<0){                //如果输入的数是负数,变正
    t=-x;
    printf("fu ");
}
else{
    t=x;
}

接下来思考如何每次获得最高位数字,就用了以下do while语句,计算出输入数的位数。

do{                     //计算输入数字的位数
    t=t/10;
    count++;
}while(t>0);

 接着用pow()函数变成10的n次方,这样就可以满足单次获取最高位数的需求。

y=pow(10,cnt-1);

最后运用switchcase将0-9这10种情况分别列出,这里的break很关键,不加的话就会执行后续语句,使得程序输出产生偏差。(t/y是最高位数字的意思)

switch(t/y){                        //switch case语句这节课教的
    case 0:printf("ling");break;
    case 1:printf("yi");break;
    case 2:printf("er");break;
    case 3:printf("san");break;
    case 4:printf("si");break;
    case 5:printf("wu");break;
    case 6:printf("liu");break;
    case 7:printf("qi");break;
    case 8:printf("ba");break;
    case 9:printf("jiu");break;
}

但是当我运行时,程序却出现了错误,无论我输入怎样的数字,正还是负,后面都是用拼音打出的ling ling ling...错在哪里呢?我再重新检查程序发现t已经用于计算输入数的位数了,那段do while语句结束后的t的值为0,这才出现了后续的错误,于是再复制一遍上述判断正负的语句就可以了。

if(x<0){                //如果输入的数是负数,变正
    t=-x;
}
else{
    t=x;
}
do{                     //计算输入数字的位数
    t=t/10;
    count++;
}while(t>0);
y=pow(10,cnt-1);        //得到y,接下去就可以用来获得最高位数字
if(x<0){                //注意!!t现在已经等于0了所以为了便捷,直接ctrl-c and ctrl-v并填上fu(负数前多输出个“fu ”)
    t=-x;
    printf("fu ");
}
else{
    t=x;
}

程序顺利执行!


认为我写的还不错,解答了你的疑惑的小伙伴们不妨点个赞、关注下我。本课程题解将会逐步更新。如文章中有你不明白的地方,又或者有更简单易懂的程序,都请在评论区大胆的提出你的疑惑或想法,博主看到一定及时解答问题,更优解会更新在文章中。让我们携手共进,早日成为lv100,能独当一面的程序猿、媛

 

 

你可能感兴趣的:(中国大学MOOC,浙江大学,程序设计入门——C语言)