初学C语言的有趣发现(一)

参考: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语言是真的有趣!且在字里行间中。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值