1013 数素数

来源:互联网 发布:手机淘宝看退款率 编辑:程序博客网 时间:2024/05/28 06:04
// 令Pi表示第i个素数。现任给两个正整数M <= N <= 10^4,请输出PM到PN的所有素数。// // 输入格式:// // 输入在一行中给出M和N,其间以空格分隔。// // 输出格式:// // 输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。// 输入样例:5 27// // 输出样例:11 13 17 19 23 29 31 37 41 43// 47 53 59 61 67 71 73 79 83 89// 97 101 103#include <stdio.h>#include <math.h>bool IsPrime(long long num){if (num == 1 || num == 2)return true;long long temp = (long long)(sqrt((long double)num));for (long long i = 2; i <= temp; i++){if (num%i == 0)return false;}return true;}int main(void){int M, N;// 记录用户输入scanf("%d %d", &M, &N);getchar();// 处理行末换行符int count = 0;// 当前素数的位置long long num = 2;// 数字,将在循环中递增来求素数int printcount = 0;// 记录当前行输出的个数while (1){bool flag = IsPrime(num);// 标记当前num是否为素数if (flag)count++;// 记录素数的位置//如果count所记录的素数位置位于输出范围内,且当前数就是素数,则输出该数if (count >= M && count <= N && flag){printf("%lld", num);printcount++;// 当行输出记数printcount不为10,且输出的不是最后一个素数的话,多输出一个空格if (printcount != 10 && count != N)printf(" ");// 当输出记数printcount为10,就说明需要换行输出,输出一个换行并重置printcountelse if (printcount == 10){printf("\n");printcount = 0;// 重新记录}}if (count == N)// 循环跳出条件break;num++;// 数字递增}return 0;}// 为了预防第10000个素数过大,所以将num做成long long类型// 做完题算了一个,第10000个素数为104729,也就是说,这个题其实用4字节的int类型够用了// 建议大家还是熟悉一下C标准所规定的各类型的最小容量,以免出现不可预知的错误// 诸如现在一般通用的int为4字节,但是C标准中只要求最小为2字节,这些小细节没事可以去熟悉一下,没有坏处

0 0
原创粉丝点击