参考:C程序设计(第五版)---5.8
今天学习了一些C语言循环示例,如:π的近似计算、斐波那契数列(兔子数列)、密码破译和1~100,101~200中质数等问题。
其中,博主根据自己掌握的知识,修改得到1~n中的质数,但其中遇到了一个小问题,程序编译运行,之后输入n的值,发现空行不同的问题,博主感到很有趣,就进行了探究。
下面是代码:
#include <stdio.h>
#include <math.h>
int main() {
int n,m,a=0;
scanf("%d", &n);
int i;
for (i = 1; i <= n; i += 2) {
if (i != 1) {
int j;
m = sqrt(i);
for (j = 2; j <= m; j++)
if (i % j == 0)
break; //如果i被j整除,终止内循环,此时j<m+1
if (j >= m + 1) { //若j>=m+1,表示i未曾被整除
printf("%-4d ", i);
a ++; //计数器a
}
if (a % 10 == 0)printf("\n"); //10组数一行
}
}
return 0;
}
此程序的优化不做过多解释,如:i+=2;m=sqrt(i);等。
运行结果:
当n=100时,发现三行数据中间各相隔两行。
当n=999时,发现仅有几行是相挨着的,并且空行个数大不相同。
于是,博主就对其进行了思考,探究,以及寻求帮助,最终找到了问题所在!!!
if (j >= m + 1) {
printf("%-4d ", i);
a ++;
}
if (a % 10 == 0)printf("\n");
当i逐渐递增,取值到连续多个非质数时(且处于换行点,即a%10==0),a可以被10连续整除,即:多个空行的出现。
如:上图,i=31时,32、33、34、35、36,37,其中31-37之中有5个连续数字(本来博主认为i++还疑惑了一会),但是因为i+=2;所以就33,35两个数,即换行两次。
附代码及运行结果
#include <stdio.h>
#include <math.h>
int main() {
int n,m,a=0;
scanf("%d", &n);
int i;
for (i = 1; i <= n; i += 2) {
if (i != 1) {
int j;
m = sqrt(i);
for (j = 2; j <= m; j++)
if (i % j == 0)
break;
if (j >= m + 1) {
printf("%-4d ", i);
a ++;
}
if (a % 10 == 0)printf("第%d个数字换行\n", i);//判断换行
}
}
return 0;
}
最后,一个小问题终于解决。
博主只能说:C语言是真的有趣!且在字里行间中。