文章目录
即将上大学了,准备上一些先修课,翁恺老师的课感觉非常不错,我是一个初学者,有啥错误大佬们别打我。
依照学术诚信条款,我保证此作业是本人独立完成的,未完成该项作业的同学请完成后再来。
此编程题的题目如下
/*简单分析一下*/胡乱分析一下
看到这题目我内心是拒绝的,因为不知道如何入手,题目中的n,m含义特殊,之间的素数也难以判断,我认为得整个素数表出来(大佬勿喷),可确实难以下手。好在我是学到第七章再回来做题的,意识到数组方面似乎可以利用,于是乎整个容量为200的数组来储存0-200个素数(建议看我这渣代码前先去看看第七章,我实在想不出啥办法了)但是问题是如何得到每一个素数呢?之前老师演示过如何判断输入的数是否为素数,相关代码如下
#include <stdio.h> int main(int argc, char const *argv[]) { int origin, i, a = 1; scanf("%d", &origin); for (i = 2; i < origin; i++) { if (origin % i == 0) { a = 0; break; } } if (a == 0) { printf("不是素数"); } else { printf("是素数"); } return 0; }
输入数为origin,从2开始除,如在2到origin中,有数能够被orgin整除,则origin不为素数。那我们是否可以利用这个原理,一个个列出素数知道得到我们想要的数呢?
答案当然是可行的。我们可以设置一个变量count,当origin为素数时加上1,如当origin的初始化为2时,count为1,在循环中,当origin加到3,count加1为2,当origin加到4,count不为所动,当origin加到5,count加1为3……以此类推,直到count=n或m时。在这过程中,每个count对应的数都应该被记录。相关代码可以这样写
int count = 0; int number[200]; int a = 1, origin = 2; while (n != count) { for (int i = 2; i < origin; i++) { if (origin % i == 0) { a = 0; break; } } if (a != 0) { count++; number[count] = origin; } origin++; a = 1; }
值得注意的是,在这段代码中初始化a为1,这样做是为了避免程序直接从内存中抽出个0来就不好玩了。循环中的a赋值为一也十分重要,否则判断一次偶数以后,程序就死循环了,也就是n大于等于3时。对于m也相同的办法,可以copy一下(“代码复制”是程序不良的体现,可以整成函数,可是好像我不会改这个)
两段代码这样的
while (n != count) { for (int i = 2; i < origin; i++) { if (origin % i == 0) { a = 0; break; } } if (a != 0) { count++; number[count] = origin; } origin++; a = 1; } while (m != count) { for (int i = 2; i < origin; i++) { if (origin % i == 0) { a = 0; break; } } if (a != 0) { count++; number[count] = origin; } origin++; a = 1; }
相加之间素数就简单多了,如下,从number[n]加到number[m]即可
for (int i = n; i <= m; i++) { sum = sum + number[i]; }
/*正确做法*/能够跑起来的做法
整体代码
#include <stdio.h> int main(int argc, char const *argv[]) { int n, m; int sum = 0; scanf("%d %d", &n, &m); int count = 0; int number[200]; int a = 1, origin = 2; while (n != count) { for (int i = 2; i < origin; i++) { if (origin % i == 0) { a = 0; break; } } if (a != 0) { count++; number[count] = origin; } origin++; a = 1; } while (m != count) { for (int i = 2; i < origin; i++) { if (origin % i == 0) { a = 0; break; } } if (a != 0) { count++; number[count] = origin; } origin++; a = 1; } for (int i = n; i <= m; i++) { sum = sum + number[i]; } printf("%d", sum); return 0; }
结果
本以为内存会很大的,表现还行?
hi,我是翁恺老师论坛上发帖的初学者,就是第五章素数题发帖求助的那位~~来这里交流了~~是直接在这里交流还是用社交平台更方便?
其实一直在找和我一起在学这门课程的人,终于找到了 :oops: