c语言求素数的问题

MarsXDM 2012-04-21 09:28:19
用下面这个程序可以得出正确的结果:
#include <stdio.h>
#include <math.h>

int main(void)
{
int k;
int n, i;

printf("请输入您要求得的数:\n");
scanf("%d",&n);

k = sqrt(n + 1);

for (i = 2; i <= k; i++)
{
if (n%i == 0) break;
}
if (i>=k+1) printf("%d 是一个素数!\n",n);
else printf("%d 不是一个素数!\n",n);

return 0;
}

但是当k定义为double的时候,结果是错误的,比如输入17,就会显示不是素数,这是什么问题呢?
...全文
555 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
MarsXDM 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
#include <stdio.h>
#include <math.h>
int main(void)
{
double k;
int n, i;

printf("请输入您要求得的数:\n");
scanf("%d",&n);

k = sqrt(n);

for (i = 2; i <= k; i++)
{
if (n%i == 0) break;
}
……
[/Quote]

有块不一样,sqrt(n)
我的是sqrt(n+1)
liubingqian 2012-04-24
  • 打赏
  • 举报
回复
本来在判断素数的时候,从2判断到sqrt(n)就行了,你判断到了sqrt(n+1),然后最后在比较的时候,你又判断i≥k+1,两次都超出一点,最后完全有可能走到else部分。


/*
* 打印100以内的素数,每行显示5个。
*/

#include <math.h>
#include <stdio.h>

int isPrime(int i);

int main(void)
{
int c = 0, i;

for (i=1; i<=100; i++)
if (isPrime(i))
{
printf("%3d", i);
c++;

if (c%5 == 0)
printf("\n");

/* if (c == 5)
{
printf("\n");
c = 0;
}
*/
}

return 0;
}

int isPrime(int i)
{
int x;
int y = (int)ceil(sqrt(i)); /* int y = (int)(sqrt(i + 1)); */

if (i == 2)
return 1;

if (i%2==0 || i<2) /* 过滤所有偶数及既不是素数又不是合数的情况 */
return 0;

for (x=3; x<=y; x++)
if (i%x == 0)
return 0;

return 1;
}

wizard_tiger 2012-04-24
  • 打赏
  • 举报
回复
如果n=17,则k=4.24
所以在出循环时i=5
则i<k+1所以显示为不是素数。

而4楼的数
如果n=17,则k=4.24
所以在出循环时i=5
则i>k所以显示为是素数。

所以i在等于17时不论k为sqrt(17)还是sqrt(18)民,n的值都在k与k+1之间。
spridexing 2012-04-24
  • 打赏
  • 举报
回复
这个应该是差不多的 int sqrt(n)=sprt(n+1) 当n>2时,比如int sqrt(2)=sqrt(3)当n越大这两个数就越接近他们的极限是一样的!
明珠港打螃蟹 2012-04-21
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <math.h>
int main(void)
{
double k;
int n, i;

printf("请输入您要求得的数:\n");
scanf("%d",&n);

k = sqrt(n);

for (i = 2; i <= k; i++)
{
if (n%i == 0) break;
}
if (i>=k) printf("%d 是一个素数!\n",n);
else printf("%d 不是一个素数!\n",n);

return 0;
}
我刚才试了下 这段。17是素数·
sundayX 2012-04-21
  • 打赏
  • 举报
回复
看错了,这个问题是发生在计算sqrt和比较时的错误。
1、计算sqrt时,由于k是double,则k的值可能会含有小数,比如5.00001。
2、i > k后,不一定i>k+1。因为k是double,在比较时i被提升为double。比如5>5.00001,但是5<5.00001+1。
tandy 2012-04-21
  • 打赏
  • 举报
回复
楼上正解
sundayX 2012-04-21
  • 打赏
  • 举报
回复
素数:指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。换句话说,只有两个正因数(1和自己)的自然数即为素数。
double:双精度浮点数,怎么可能是自然数呢。既然不是自然数,也就不是素数。
wuliao_00 2012-04-21
  • 打赏
  • 举报
回复
#include "stdio.h"
#include "conio.h"

main()
{
int a;
scanf("%d",&a);
if(a<2)
{
printf("Error\n");
}
else if(a%2!=0 && a%3!=0 ||a==2 ||a==3)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}



这个代码不简单些。。
wuliao_00 2012-04-21
  • 打赏
  • 举报
回复
#include "stdio.h"
#include "conio.h"

main()
{
int a;
scanf("%d",&a);
if(a<2)
{
printf("Error\n");
}
else if(a%2!=0 && a%3!=0 ||a==2 ||a==3)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}


这个代码不更好一些。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧