600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > c语言mooc第五周作业 中国大学MOOC 浙江大学《程序设计入门——C语言》第5周:循环

c语言mooc第五周作业 中国大学MOOC 浙江大学《程序设计入门——C语言》第5周:循环

时间:2023-08-05 17:56:48

相关推荐

c语言mooc第五周作业 中国大学MOOC 浙江大学《程序设计入门——C语言》第5周:循环

输入格式:

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

输出格式:

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

输入样例:

2 4

输出样例:

15

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

#includeint 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;

}

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

/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,能独当一面的程序猿、媛

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。