打印 100-200 之间的素数
程序:
// 打印 100-200 之间的素数
// 素数判断的规则:试除法
#include<stdio.h>
int main(void)
{
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
// 根据试除法需要产生 2 到 i-1
int j = 0;
for (j = 2; j < i; j++)
{
if (!(i % j))
{
break;
}
}
if (j == i) // 代码执行到该行,可能是因为执行了break,此时i不是素数,也可能是j增加到最后达到i,循环结束了,此时i是素数
{
printf("%d is prime.\n", i);
count++;
}
}
printf("%d primes.\n", count);
return 0;
}
结果:
101 is prime.
103 is prime.
107 is prime.
109 is prime.
113 is prime.
127 is prime.
131 is prime.
137 is prime.
139 is prime.
149 is prime.
151 is prime.
157 is prime.
163 is prime.
167 is prime.
173 is prime.
179 is prime.
181 is prime.
191 is prime.
193 is prime.
197 is prime.
199 is prime.
21 primes.
但此代码还有很大优化空间.
如果一个数 i 不是素数, 则两个乘机因子至少有一个小于 i 的平方. 因此不必搜索到 i-1, 只需要搜索到 i 的平方根.
优化后的代码:
// 打印 100-200 之间的素数
// 素数判断的规则:试除法
#include<stdio.h>
#include<math.h>
int main(void)
{
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
// 根据试除法需要产生 2 到 i-1
int j = 0;
for (j = 2; j <= sqrt(i); j++)
{
if (!(i % j))
{
break;
}
}
if (j >sqrt(i)) // 代码执行到该行,可能是因为执行了break,此时i不是素数,也可能是j增加到最后达到i,循环结束了,此时i是素数
{
printf("%d is prime.\n", i);
count++;
}
}
printf("%d primes.\n", count);
return 0;
}
又因为偶数不可能是素数, 因此可以将偶数剔除, 效率将会提升一倍.
优化后的代码:
// 打印 100-200 之间的素数
// 素数判断的规则:试除法
#include<stdio.h>
#include<math.h>
int main(void)
{
int i = 0;
int count = 0;
for (i = 101; i <= 200; i+=2)
{
// 根据试除法需要产生 2 到 i-1
int j = 0;
for (j = 2; j <= sqrt(i); j++)
{
if (!(i % j))
{
break;
}
}
if (j >sqrt(i)) // 代码执行到该行,可能是因为执行了break,此时i不是素数,也可能是j增加到最后达到i,循环结束了,此时i是素数
{
printf("%d is prime.\n", i);
count++;
}
}
printf("%d primes.\n", count);
return 0;
}
求指定数字是否是素数
程序:
#include<stdio.h>
#include<stdbool.h>
int main(void)
{
unsigned long num;
unsigned long div;
bool isPrime;
printf("Please enter an integer for analysis; ");
printf("Enter q to quit.\n");
while (scanf("%lu", &num) == 1)
{
if (1 == num)
{
printf("1 is not a prime.\n");
printf("Please enter an integer for analysis; ");
printf("Enter q to quit.\n");
continue;
}
for (div = 2, isPrime = true; (div * div) <= num; div++)
{
if (num % div == 0)
{
if ((div * div) != num)
{
printf("%lu is divisible by %lu and %lu.\n", num, div, num / div);
}
else
{
printf("%lu is divisible by %lu.\n", num, div);
}
isPrime = false;
}
}
if (isPrime)
{
printf("%lu is prime.\n", num);
}
printf("Please enter an integer for analysis; ");
printf("Enter q to quit.\n");
}
printf("Bye.\n");
return 0;
}