搜索
查看: 739|回复: 8
打印 上一主题 下一主题

给出一个大于三的正整数,判断是不是素数,不知道哪里错了,能详细的讲一下吗,谢谢!

[复制链接]
跳转到指定楼层
楼主
发表于 2014-7-1 01:12:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
给出一个大于三的正整数,判断是不是素数,不知道哪里错了,能详细的讲一下吗,谢谢!N-S图以给出,是按照这个图写的程序,不知道哪里出错,帮帮忙吧!非常感谢!!!
下面是程序:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int w,n,i;
double a;
    scanf("%d",&n);
    w=0;
    i=2;
    a=(double)n;
    while(i>sqrt(a)||(w!=0))
    {
     if (n%i==0)
     w=0;
     else
     i++;
    }
    if(w==0)
   printf("%d是素数\n",n);
   else
   printf("%d不是素数\n",n);
    system("pause");
    return 0;
}


2.jpg (44 KB, 下载次数: 10)

这是N-S图

这是N-S图

最佳答案

查看完整内容

你的N-S图中写到“直到i>sqrt(n)或w!=0”,也就是说当isqrt(a)||(w!=0))[/mw_shl_code] 应改为[mw_shl_code=c,true]while(i
沙发
发表于 2014-7-1 01:12:36 | 只看该作者
你的N-S图中写到“直到i>sqrt(n)或w!=0”,也就是说当i<=sqrt(n)w=0时要执行循环体
因此[mw_shl_code=c,true] while(i>sqrt(a)||(w!=0))[/mw_shl_code]
应改为[mw_shl_code=c,true]while(i<=sqrt(a)&&w==0)[/mw_shl_code]
注意while后的()中填的是执行循环体的条件,而非终止循环的条件

还有[mw_shl_code=c,true] if (n%i==0)
     w=0;
[/mw_shl_code]
N-S图中说此时应把1,而非0,赋给w
修改完的代码:
[mw_shl_code=c,true]#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
        int w,n,i;
        double a;
    scanf("%d",&n);
    w=0;
    i=2;
    a=(double)n;
    while(i<=sqrt(a)&&w==0)
    {
     if (n%i==0)
                 w=1;
     else
                 i++;
    }
    if(w==0)
           printf("%d是素数\n",n);
        else
           printf("%d不是素数\n",n);
    system("pause");
    return 0;
}[/mw_shl_code]
另外int向double的转化容易造成精度损失,因此应尽力避免
[mw_shl_code=c,true]a=(double)n;[/mw_shl_code]
之类的强制类型转化。
板凳
发表于 2014-7-1 12:43:37 | 只看该作者
你的程序貌似有些麻烦了。
首先我们要知道要判素数只要在这个数÷2的范围内试除,如果都除不尽就能判断它是一个素数了。
首先定义一个变量存储输入的一个数。
[mw_shl_code=c,true]int a;[/mw_shl_code]
接着为了方便我们定义一个标志变量f来存储是否为素数的标志,初始值为0。[mw_shl_code=c,true]int f=0;[/mw_shl_code]
即如果找到了输入数的除了它本身和1以外的约数就表示它是一个合数。这时我们可以把f的值改为1(或增加1)。最后如果f依然等于0就表示这个输入数除了它本身和1以外没有其他约数,即这个数是一个素数。
最后定义一个循环变量i。这个i不仅是循环变量同时也是每一遍循环中输入的数a要试除的数。
[mw_shl_code=c,true]int i;[/mw_shl_code]
剩下的就简单了,一个循环就能解决。直接上代码。[mw_shl_code=c,true]#include<stdio.h>
#include<stdlib.h>
int main()
{
    int a;/*输入的数*/
    int f=0;/*标志变量*/
    int i;/*试除的数,同时也是循环变量*/
    scanf("%d",&a);
    for(i=2;i<=a/2;i++)
    {
        if(a%i==0)
        {
            f=1;
            break;
        }
    }
    if(f=0)
        printf("素数");
    else
        printf("合数");
    system("pause");
    return 0;
}[/mw_shl_code]







地板
发表于 2014-7-1 13:38:58 | 只看该作者
本帖最后由 981013 于 2014-7-1 14:17 编辑
LeoGuozichuan 发表于 2014-7-1 12:43
你的程序貌似有些麻烦了。
首先我们要知道要判素数只要在这个数÷2的范围内试除,如果都除不尽就能判断它 ...

首先17行f=0这句是f==0之误。
实际上试除到sqrt(a)就可以了,不过直接用sqrt函数不合适(这个函数接受和返回浮点数,会有精度损失),可以写成[mw_shl_code=c,true]i*i<=a[/mw_shl_code]
修改完的代码:[mw_shl_code=c,true]#include<stdio.h>
#include<stdlib.h>
int main()
{
int a,i,f=0;
scanf("%d",&a);
for(i=2;i*i<=a;++i)
{
if(a%i==0)
{
f=1;
break;
}
}
if(f==0)
printf("素数\n");
else
printf("合数\n");
system("pause");
return 0;
}
[/mw_shl_code]
按楼主的算法写的代码,其实原理和上面那个一样[mw_shl_code=c,true]#include<stdio.h>
#include<stdlib.h>
int main()
{
int n,w=0,i;
scanf("%d",&n);
for(i=2;i*i<=n&&w==0;)
{
int r=n%i;
if(r==0)
w=1;
else
++i;
}
if(w==0)
printf("n是素数\n");
else
printf("n不是素数\n");
system("pause");
return 0;
}
[/mw_shl_code]

评分

参与人数 1啊哈币 +3 收起 理由
李掌柜 + 3 很给力!

查看全部评分

5#
 楼主| 发表于 2014-7-2 01:17:55 | 只看该作者
981013 发表于 2014-7-1 13:38
首先17行f=0这句是f==0之误。
实际上试除到sqrt(a)就可以了,不过直接用sqrt函数不合适(这个函数接受和 ...

能把我写的程序基础上改正确吗?我一直不明白我错在哪里了!谢谢帮忙了!
6#
 楼主| 发表于 2014-7-2 01:20:05 | 只看该作者
LeoGuozichuan 发表于 2014-7-1 12:43
你的程序貌似有些麻烦了。
首先我们要知道要判素数只要在这个数÷2的范围内试除,如果都除不尽就能判断它 ...

谢谢喽!但是我想知道我错在哪里,能在我写的基础上改正确吗?
7#
发表于 2014-7-3 15:25:42 | 只看该作者
981013 发表于 2014-7-2 12:37
你的N-S图中写到“直到i>sqrt(n)或w!=0”,也就是说当isqrt(a)||(w!=0))[/mw_shl_code]
应改为[mw_shl_cod ...

int向double转化是不会丢失精度的
8#
 楼主| 发表于 2014-7-4 21:31:42 | 只看该作者
981013 发表于 2014-7-2 12:37
你的N-S图中写到“直到i>sqrt(n)或w!=0”,也就是说当isqrt(a)||(w!=0))[/mw_shl_code]
应改为[mw_shl_cod ...

嗯嗯,我明白了!谢谢你!
9#
 楼主| 发表于 2014-7-4 21:36:10 | 只看该作者
rosynirvana 发表于 2014-7-3 15:25
int向double转化是不会丢失精度的

恩,我明白了!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表