练习4-11 统计素数并求和 (20 分)算法
本题要求统计给定整数M和N区间内素数的个数并对它们求和。函数
输入格式:
输入在一行中给出两个正整数M和N(1)。测试
输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。加密
输入样例:
10 31
输出样例:
7 143
#include <stdio.h> #include<math.h> int p(int n); int main() { int n, m, i, count=0, sum=0; scanf("%d%d", &n, &m); for(i=n;i<=m;i++) { if(p(i)==1) { sum=sum+i; count++; } } printf("%d %d",count,sum); return 0; } int p(int n) { int i; for(i=2;i<=sqrt(n);i++) if(n%i==0) break; if(n<=0||n%1!=0) return 0; else if(i>sqrt(n)&&n!=1) return 1; else return 0; }
科普:spa
质数(Prime number),又称素数,指在大于1的天然数中,除了1和该数自身外,没法被其余天然数整除的数(也可定义为只有1与该数自己两个正因数的数)。大于1的天然数若不是素数,则称之为合数(也称为合成数)。例如,5是个素数,由于其正约数只有1与5。而6则是个合数,由于除了1与6外,2与3也是其正约数。算术基本定理确立了素数于数论里的核心地位:任何大于1的整数都可被表示成一串惟一素数之乘积。为了确保该定理的惟一性,1被定义为不是素数,由于在因式分解中能够有任意多个1(如三、1×三、1×1×3等都是3的有效约数分解)。code
古希腊数学家欧几里得于公元前300年先后证实有无限多个素数存在(欧几里得定理)。现时人们已发现多种验证素数的方法。其中试除法比较简单,但需时较长:设被测试的天然数为,使用此方法者需逐一测试2与之间的整数,确保它们无一能整除n。对于较大或一些具特别形式(如梅森数)的天然数,人们一般使用较有效率的算法测试其是否为素数(例如277232917-1是直至2018年8月为止已知最大的梅森素数,也是直至2018年8月为止已知最大的素数)。虽然人们仍未发现能够彻底区别素数与合数的公式,但已建构了素数的分布模式(亦即素数在大数时的统计模式)。19世纪晚期获得证实的素数定理指出:一个任意天然数n为素数的几率反比于其数位(或的对数)。blog
许多有关素数的问题依然未解,如哥德巴赫猜测(每一个大于2的偶数可表示成两个素数之和)及孪生素数猜测(存在无穷多对相差2的素数)。这些问题促进了数论各个分支的发展,主要在于数字的解析或代数方面。素数被用于资讯科技里的几个程序中,如公钥加密利用了难以将大数分解成其素因数之类的性质。素数亦在其余数学领域里造成了各类广义化的素数概念,主要出如今代数里,如素元及素理想。ip
来源:维基百科-质数(https://zh.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0)get