素数:质数(prime number)又称素数,除了1和它本身以外不再有其他的因数。
1)判断一个大于2的正整数是否是素数
#include<stdio.h>
#include<math.h>
#include<iostream>
int main()
{
int num;
printf("请输入一个大于2的正整数:");
scanf("%d",&num);
int count = 0;
for(int i = 2;i < num/2;i++) {
if(num % i == 0) {
count++;
}
}
if(count == 0) {
printf("%d是素数.\n",num);
}
else printf("%d不是素数.\n",num);
system("pause");
return 0;
}
int main() {
int num , i;
printf("please input a number above 2:");
scanf("%d",&num);
for(i = 2; i <= sqrt(num); i++) {
if(num % i == 0)
break;
}
if(i > sqrt(num)) {
printf("%d is a prime number.\n",num);
}
else
printf("%d is not a prime number.\n",num);
system("pause");
return 0;
}
输出结果:
2) 请输出3-100之间的素数
第一种:遍历2-num之间的所有数
int main()
{
int primer[50];
int k = 0;
for(int i = 3;i <= 100;i++)
{
int count = 0;
for(int j = 2;j <= sqrt(i);j++)
{
if(i%j == 0)
{
count++; //如果不是素数,遍历的次数过多??
continue;
}
}
if(count == 0)//没有能被整除的数
{
primer[k++] = i;
}
}
printf("3-100之间的素数有:\n");
for(int i = 0;i < k;i++)
{
printf("%d\t",primer[i]);
if((i+1)%6 == 0) //print 6 number one line
printf("\n");
}
system("pause");
return 0;
}
输出结果如下:
第二种:遇到能被整除的数,直接跳出循环。
int main()
{
int primer[50];
int k = 0,j;
for(int i = 3;i <= 100;i++){
for(j = 2;j <= sqrt(i);j++){
if(i%j == 0){
break;//跳出里面的那个for循环
}
}
if(j > sqrt(i)) {
primer[k++] = i;
}
}
printf("3-100之间的素数有:\n");
for(int i = 0;i < k;i++) {
printf("%d\t",primer[i]);
if((i+1)%6 == 0)
printf("\n");
}
system("pause");
return 0;
}
输出结果和上面的相同,但是循环次数明显减少,减小了算法复杂度。
3)一个偶数总能表示为两个素数之和。
#include<stdio.h>
#include<math.h>
#include<iostream>
int main() {
int num,a,b,i,j;
printf("please input a even number bigger than 6:\n");
scanf("%d",&num);
for(a = 3;a < num/2;a++) //num > 6
{
for(i = 2;i <= sqrt((double)a);i++) {
if(a % i == 0)
break;
}
if(i > sqrt((double)a))
b = num - a;
else continue;//next cycle
for(j = 2 ; j <= sqrt((double)b);j++) {
if(b % j ==0)
break;
}
if(j > sqrt((double)b)) {
printf("%d = %d + %d\n",num,a,b);
system("pause");
return 0;
}
}
}