C语言判断素数(求素数)(两种方法)
素数又称质数。所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任一整数整除。
思路1):因此判断一个整数m是否是素数,只需把 m 被 2 ~ m-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数。
思路2):另外判断方法还可以简化。m 不必被 2 ~ m-1 之间的每一个整数去除,只需被 2 ~ 之间的每一个整数去除就可以了。如果 m
不能被 2 ~ 间任一整数整除,m 必定是素数。例如判别 17 是是否为素数,只需使 17 被 2~4
之间的每一个整数去除,由于都不能整除,可以判定 17 是素数。 原因:因为如果 m 能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于 ,另一个大于或等于 。例如 16 能被 2、4、8 整除,16=28,2 小于 4,8 大于 4,16=44,4=√16,因此只需判定在 2~4 之间有无因子即可。
两种思路的代码请看解析。
思路1) 的代码:
#include
int main(){
int a=0; // 素数的个数
int num=0; // 输入的整数
printf("输入一个整数:");
scanf("%d",&num);
for(int i=2;i if(num%i==0){ a++; // 素数个数加1 } } if(a==0){ printf("%d是素数。\n", num); }else{ printf("%d不是素数。\n", num); } return 0; } 思路2)的代码: #include #include void main(){ int m; // 输入的整数 int i; // 循环次数 int k; // m 的平方根 printf("输入一个整数:"); scanf("%d",&m); // 求平方根,注意sqrt()的参数为 double 类型,这里要强制转换m的类型 k=(int)sqrt( (double)m ); for(i=2;i<=k;i++) if(m%i==0) break; // 如果完成所有循环,那么m为素数 // 注意最后一次循环,会执行i++,此时 i=k+1,所以有i>k if(i>k) printf("%d是素数。\n",m); else printf("%d不是素数。\n",m); return 0; } /*一种高效的方法*/ bool isPrime_3(int num){ //两个较小数另外处理 if(num == 2 || num == 3) return true; //不在6的倍数两侧的一定不是质数 if(num % 6 != 1 && num % 6 != 5) return false; int i; //在6的倍数两侧的也可能不是质数 for(i = 2;i <= sqrt(num);i += 6){ if(num % i == 0 || num % (i + 2) == 0) return false; } //排除所有,剩余的是质数 return true; } 对负数与0,1进行异常处理 int main(){ int num; bool result1,result2; printf("请输入一个正整数,以-1结束: "); scanf("%d",&num); while(num < 2 && num != -1){ printf("输入不合法,请重新输入!(说明:素数必须大于1)\n"); printf("请输入一个正整数,以-1结束: "); scanf("%d",&num); } while(num >= 2 && num != -1){ result1 = isPrime(num); result2 = isPrime_3(num); if(result1 == true) printf("%d 是素数\n",num); else if(result1 == false) printf("%d 不是素数\n",num); if(result2 == true) printf("%d 是素数\n\n",num); else if(result2 == false) printf("%d 不是素数\n\n",num); printf("请输入一个正整数,以-1结束: "); scanf("%d",&num); while(num < 2 && num != -1){ printf("输入不合法,请重新输入!(说明:素数必须大于1)\n"); printf("请输入一个正整数,以-1结束: "); scanf("%d",&num); } } } c语言对0取余数,c语言余数为0怎么表示 c语言中怎样取余数 很简单,只需要一步,也就是只需要一张图:C语言提供了一个取余数的运算符%,称之为“模”运算符。只有两个整数之间才可以进行模运算!a % b 表示 用b来整除a,商整数,得到余数。 如:5%3 = 2、4%3 =1、3%3 =0。 扩展资料 C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。 尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。 二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。 C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。 其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。 参考资料:百度百科-c语言 c语言对0取余数,c语言余数为0怎么表示 c语言中取余%怎么用 c语言中取余%用法: 两边的运算量必须为整型,且%后面的运算量不能为0。 例如: 7 % 4 商为1 余数值为3。 7 % 4 余数值为3。 4 % 7 余数值为4。 10 % 5 余数值为0。 %—取余运算符,职能作用于两个整型数(正整数、负整数),运算结果是两数相除后的余数,运算结果为整数。 规定: 运算结果正负号与被除数符号一致。 被除数小于除数时,运算结果等于被除数。 取余,也就是求余数,使用的运算符是 %。C 语言中的取余运算只能针对整数,也就是说,% 的两边都必须是整数,不能出现小数,否则编译器会报错。 另外,余数可以是正数也可以是负数,由 % 左边的整数决定: 如果 % 左边是正数,那么余数也是正数。 如果 % 左边是负数,那么余数也是负数。 C语言里 0%2是多少 0%2=0,0%2是没有余数,%是表示“取余数”0除以任何数后都不会存在余数,所,以说余数为0。这是一个取模运算,在数论和程序设计中都有着广泛的应用,奇偶数的判别到素数的判别,从模幂运算到最大公约数的求法,从孙子问题到凯撒密码问题,无不充斥着模运算的身影。 扩展资料: 对于整型数a,b来说,取模运算或者求余运算的方法都是: 1、求整数商: c = [a/b]; 2、计算模或者余数: r = a - c*b. 求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。 例如计算:-7 Mod 4 那么:a = -7;b = 4; 第一步:求整数商c,如进行求模运算c = -2(向负无穷方向舍入),求余c = -1(向0方向舍入); 第二步:计算模和余数的公式相同,但因c的值不同,求模时r = 1,求余时r = -3。 归纳:当a和b符号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。 当符号不一致时,结果不一样。 C语言怎么求余数 1、首先,我们需要打开任意编程软件,小编使用的是Dev c++ 2、然后,我们需要新建一个源代码, 如下图所示 3、然后我们需要输入代码 #include stdio.h int main() { int i=0; scanf("%d",i); int j; j=i%2; printf("%d",j); return 0; } 表示取输入的数除以二的 余数 。 4、最后,我们编译测试,我们输入9,得到的结果为1,正确。 拓展资料: C语言里对于有一些符号是不能直接输出的,因为被C语言占用了。所以有一些符号是需要特殊的方式才能输出的。比如你说的%号,%号在C语言里是求余数的符号,如果需要输出%的话,你需要连续写2个%才能输出。如:printf(“x%%y=%f\n”,e); c语言中,0%10是多少?其中%是取余的意思 0%10是0,10除以10等于1余0,所以是0。 %10是取余,“%”符号表示的是求余运算,0%任何整数=0,0除以10取余数; 例如:25%10=5,*s指取内容,s最初指向的是字符A,下次指向B; 15%2,15=2×7+1,这里的1就是结果。 扩展资料 C语言取余X%Y 1、存在负数时 if|x||y| ans:x+y else ans:x eg:-6%5==-1,6%(-5)1,5%-65,-5%6==-5 2、同号时,将两个数视为正整数,但结果加一个负号 eg:-1%-5==-1,-6%-5==-1,-4%-5==-4,-5%-6==-5 摘要 本文介绍了判断素数的3种方法,从素数的概念分析,确定找到素数的几个必要条件,设计思路,并将代码进行优化。此外,还使用自定义函数的形式将同样的思路进行实现。 方法1 素数是什么 素数,就是仅能被自身和1整除的数字。 条件分析 首先我们可以提取出判断素数的三个基本条件: 素数是整数素数能被自身整除素数能被1整除 设计思路 以一道题为例—— 求100到200之间的所有素数并输出。 大体思路 遍历 首先,得到100到200间的所有数字(记为a)——for循环 当 A%B==0时说明A被B整除了 根据两个基本条件——a能被1整除,且a能被自身整除,所以除数(记为b)应为2到a-1间的所有数字——for循环设置判断条件 当a%b0时a不是素数 设置标记变量flag,当a%b0时令flag=1;后续循环没必要进行,因此设置break;结束该循环。 特别注意flag何时初始化为0 具体代码实现 #include int main() { int a, b, flag; for (a = 100; a <= 200; a++) //得到100到200间的所有数字 { flag = 0; //先假设a为素数 for (b = 2; b < a; b++) //注意,不要忘了自身也能被整除! { if (a % b == 0) { flag = 1; //若出现不能整除的情况,则令flag为1 break; } } //标记变量——flag if (0 == flag) printf("%d ", a); } return 0; } 最终结果输出为—— 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 代码优化 我们先解决一个数学问题—— 若a为一个整数,则显然a=√a√a,因为√a=√a,所以若有其他数cd=a,则一定存在一个数大于√a,一个数小于√a,因此大于√a之后的数字我们不需要再进行遍历了。 (同理,如果你不想思考这么多,写个b 因此第二个循环: for (b = 2; b < a; b++) 我们可以优化为—— int k; k=(int)sqrt((double)a); for (b = 2; b < a; b++) 注:求平方根函数内参数要求为double类型,因此先将a强制转换为double型,而k是整型,所以将sqrt计算返回值再进行强制转换为int型。 或者用不那么绕的写法—— int k; k=(int)sqrt(1.0*a); //1.0*a同样将a强制转换为double型 for (b = 2; b < a; b++) #include #include int main() { int a, b, flag; for (a = 100; a <= 200; a++) //得到100到200间的所有数字 { flag = 0; //先假设a为素数 int k; k = (int)sqrt((double)i); for (b = 2; b < k; b++) //注意,不要忘了自身也能被整除! { if (a % b == 0) { flag = 1; //若出现不能整除的情况,则令flag为1 break; } } //标记变量——flag if (0 == flag) printf("%d ", a); } return 0; } 求电梯控制c语言程序,电梯控制系统c语言程序