c语言-求教C语言判断素数程序算法,为何j<=sqrt((double)i )??

问题描述

求教C语言判断素数程序算法,为何j<=sqrt((double)i )??

#include
#include
void fun(int a, int b, int *c)
{ int i,j,d,y;
for (i=3;i<=a/2;i=i+2)
{
/
************found**************/
y=1;

for (j=2;j<=sqrt((double)i );j++)//??为何j<=sqrt((double)i )??
if (i%j==0) y=0;
if (y==1)
{
/*************found**************/
d=a-i;

for (j=2;j<=sqrt((double)d );j++)
if (d%j==0) y=0;
if (y==1)
{*b=i; *c=d;}
}
}
}
void main()
{ int a,b,c;
do
{ printf("
Input a: ");
_ scanf("%d",&a);}_
while(a%2);
_ fun(a,&b,&c);_
printf("

%d=%d+%d
",a,b,c);
}
====求教C语言判断素数程序算法,为何j<=sqrt((double)i )??一般不是用j<i来判断是否为素数吗?

解决方案

比如 说i为64,判断它是否为素数,那么j的取值为从2到8(不需要再增加),因为当j从2增加到8,那么i÷j的商(取整)就是当j超过8时的值。当j取2时,商为32,那么j还需要增加到32吗?不需要了,希望你理解

解决方案二:

因为可能有浮点计算的误差,所以最好用小于等于

 j<=(int)sqrt((double)i)
这样写最好

解决方案三:

 比如说sqrt(64),按理说应该算出来是8,但是也可能是7.999998(比如说)
那么j<sqrt((double)i)可能就只能算到6,会少算一个

解决方案四:

 一个数肯定不能被大于自己平方根的数整除。所以无需判断。
当然j<i也是对的。至于哪个版本程序效率高,不一定,因为平方根的开销很大,如果是100以内的素数,用平方根所用的时间比节省的那几十次循环要多。

解决方案五:

C语言计算或比较时,对于不同精度的处理是默认向精度高的数据类型转换。
所以有时为了取得数值计算的准确度更高,就会使用精度高的数据类型,如上转 double 的实例。

解决方案六:

基于visual Studio2013解决C语言竞赛题之0601判断素数函数
----------------------

时间: 2024-08-30 19:32:18

c语言-求教C语言判断素数程序算法,为何j&amp;lt;=sqrt((double)i )??的相关文章

c语言-求教C语言单项链表逆置NODE * fun(NODE *h)函数每步步骤详细解读

问题描述 求教C语言单项链表逆置NODE * fun(NODE *h)函数每步步骤详细解读 #include #include #define N 5 typedef struct node { int data; struct node next; } NODE; /*********found**********/ NODE * fun(NODE h) { NODE *p, *q, *r; p = h; if (p == NULL) return NULL; q = p->next; p->

c语言-求教C语言的输出问题。谢谢了。

问题描述 求教C语言的输出问题.谢谢了. 在C语言读入TXT文件的字符后,输出会在每一行中间有换行符.请问怎么取消这个换行符? 解决方案 怎么会有换行符,你加了 ? 解决方案二: 如果有,去掉 .或者你用的writeline,用write代替 解决方案三: C语言输出乱码问题c语言输出空格问题.C语言中的一个关于基本类型的输出问题 解决方案四: 你可以每次读取两行,把这两行加在一起,不就ok了嘛 解决方案五: ##1. 我觉得你应该考虑一下是不是自己的写入方式有问题,你检查下是不是自己在写进tx

C#判断素数的算法

素数是只能被1或本身整除,且不能为其他两个整数的乘积.1.2.3本身就是素数,判断一个数是否为素数,只需要用这个值依次除以2到它的开方数,如果其中有一个数可以整除,那么该值不为素数,返之为素数.代码如下: using System; using System.Collections.Generic; using System.Text; namespace ExPrimeNumber { class PrimeNumber { public bool primeNumber(int n) { b

c语言打印素数程序求大神

问题描述 c语言打印素数程序求大神 #include int main() { int a[101],i,j; for(i=0;i<101;i++) a[i]=i; for(i=0;i<101;i++) { for(j=0;j<i-1;j++) { if(a[i]%j!=0)break; } a[i]=0; } for(i=0;i<101;i++) if(a[i]=0) printf("%d is a sushu.",i); return 0; } 初学者啊啊啊

c语言-C语言两个类似的小程序求教区别

问题描述 C语言两个类似的小程序求教区别 第一个程序如下:#include int a=2; int f() { static int n; int m; m=n=0; n++;a++;m++; return n+m+a; } main() { _ int k; for(k=0;k<3;k++) printf("%d,",f()); printf("n");_ } 程序运行结果: 5,6,7, 第二个程序如下: #include int a=2; int f(

c语言-C语言求教,进制转换代码

问题描述 C语言求教,进制转换代码 请大家帮我看看我的程序有什么错误,感激不尽! /* num:数字 i:进制数 k:总位数 */ #include"stdio.h" #include"math.h" int firsttext(int num,int i){ int k; for(k=1;;k++){ if(num<((int)pow((float)i,(float)k))) break; } --k; return k; } int printouteve

新手求教c语言在DEV C++中运行问题

问题描述 新手求教c语言在DEV C++中运行问题 ![ 为啥我所有的if语句都是不执行的,新手小白求教. 换成最简单的逻辑了还是不行,所有的if都不执行,全角半角的问题注意了并没有用 ----------------------------------问题来了,printf出来abc这时候是1,0,0 解决方案 你打印一下a,b,c看看,你输入的时候有逗号,空格,是不是导致b,c没有获取到实际的数字 解决方案二: 你输入的a= 1,b=2,c=3,第一步判断a是否比b大,答案是否定的,所以执行

网络编程-求教C语言能申请GET或CGI连接后如何获取数据。

问题描述 求教C语言能申请GET或CGI连接后如何获取数据. 本人现在在公司实习中,做的这个方向公司里只有一个人在研究.希望各位大神不吝帮助. 我们现在需要连接一个网络摄像头,用的是LINUX系统的ARM核心的板子.网络摄像头的API只有WINDOWS平台的,LINUX平台下只能通过浏览器的GET或CGI连接在网页中显示视频.该视频为RTP连接.这本来是浏览器的工作,现在要在自己的APP中实现提取视频的数据,之后做相关处理. 请问如何直接用应用程序获得GET或CGI申请后的那个RTP连接? 谢谢

c语言问题-小白c语言求教,求大神解答

问题描述 小白c语言求教,求大神解答 #include int main(void) { int years,days; years=21; days=years*365; printf(" The years is %d. The days are %d. ".years,days); Return 0; } 程序无法运行,提示错误.求大神解答.小弟在这里先谢谢啦. 解决方案 printf(" The years is %d. The days are %d. "