素数即只能被自身和1整除的大于1的正整数。
第一个问题是如何判断n是否是素数,可以用所有大于1小于其本身的整数去试着整除该数,若该区间内存在某个数能整除该数则该数不是素数。但其实不需测试到n-1,只需测试到 sqrt(n)+1 即可。原因如下:
假设n存在大于等于sqrt(n)的因数y,则z = n/y必同时为n的因数,且其值小于等于 sqrt(n) 否则 z*y>n
素数判定
题目描述
给定一个数n,要求判断其是否为素数(0,1,负数都是非素数)。
输入描述:
测试数据有多组,每组输入一个数n。
输出描述:
对于每组输入,若是素数则输出yes,否则输入no。
示例1
输入
13
输出
yes
1 #include<stdio.h> 2 #include<math.h> 3 4 int main() 5 { 6 int x,y; 7 int i; 8 int flag; 9 while( scanf("%d",&x)!=EOF) 10 { 11 flag = 1; 12 if( x<=1 ) flag = 0; //小于等于1必不是素数 13 14 else 15 { 16 y = (int)sqrt(x)+1; //开方有可能是小数,强制转换 17 18 for( i=2; i<y; i++) 19 { 20 //这里注意素数从2开始 21 if( x%i==0) 22 { 23 flag = 0; 24 break; 25 } 26 } 27 } 28 if( !flag) printf("no\n"); 29 else printf("yes\n"); 30 31 } 32 return 0; 33 }
第二个问题是枚举出一个范围的所有素数。
素数
题目描述
输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数,如果没有则输出-1。
输入描述:
输入有多组数据。 每组一行,输入n。
输出描述:
输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数(素数之间用空格隔开,最后一个素数后面没有空格),如果没有则输出-1。
示例1
输入
100
输出
11 31 41 61 71
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 int n,x; 7 int ans[2000]; //存放目标素数 8 int index; 9 int i; 10 int isPrime,flag; 11 while(scanf("%d",&n)!=EOF) 12 { 13 index = 0; //存放目标素数的个数 14 flag = 1; //解决空格问题 15 for(x = 2 ; x < n ; x++ ) 16 { 17 isPrime = 1; //判断是否是素数 18 for (i = 2; i < x ; i++) 19 { 20 if (x % i ==0) 21 { 22 isPrime = 0; 23 break; 24 } 25 } 26 if (isPrime == 1) 27 { 28 if( x%10 == 1){ 29 //判断尾数是否是1 30 ans[index++] = x; 31 } 32 } 33 } 34 for( i=0; i<index; i++){ 35 if(flag) flag=0; 36 else printf(" "); 37 printf("%d",ans[i]); 38 } 39 } 40 41 return 0; 42 }