初学C 自己写的一个求质数程序【我知道这个算法有点烂】 不过还是请高手帮我看看 编译后只能打印61以内的
#include<stdio.h>voidzhishu(inta){inti,j,k,s,num[10000],b[10000];for(i=2;i<a;i++)num[...
#include <stdio.h>
void zhishu (int a)
{
int i,j,k,s,num[10000],b[10000];
for(i=2;i<a;i++)
num[i]=i;
printf("%d以内的质数为:",a);
for(;a>1;)
{
for(i=2,j=2;i<a;i++,j++)
b[j]=a%num[i];
for(s=1,j=2;j<a;j++)
{
s*=b[j];
}
if(s!=0)
printf("%d ",a);
a--;
}
}
int main()
{
int num;
printf("输入一个正整数:");
scanf("%d",&num);
zhishu(num);
printf("\n");
return 0;
} 展开
void zhishu (int a)
{
int i,j,k,s,num[10000],b[10000];
for(i=2;i<a;i++)
num[i]=i;
printf("%d以内的质数为:",a);
for(;a>1;)
{
for(i=2,j=2;i<a;i++,j++)
b[j]=a%num[i];
for(s=1,j=2;j<a;j++)
{
s*=b[j];
}
if(s!=0)
printf("%d ",a);
a--;
}
}
int main()
{
int num;
printf("输入一个正整数:");
scanf("%d",&num);
zhishu(num);
printf("\n");
return 0;
} 展开
展开全部
s*=b[j]; 导致s越界,可能等于一个很大的数然后解释成0了,如s等于0x****00000000然后前面的****溢出,结果导致s=0;改成:
#include <stdio.h>
void zhishu (int a)
{
int i,j,k,s,num[10000],b[10000];
for(i=2;i<a;i++)
num[i]=i;
printf("%d以内的质数为:",a);
for(;a>1;)
{
for(i=2,j=2;i<a;i++,j++)
b[j]=a%num[i];
s = 1;
for(j=2;j<a;j++)
{
//s*=b[j];
if(b[j] == 0)
{
s = 0;
break;
}
}
if(s!=0)
printf("%d ",a);
a--;
}
}
int main()
{
int num;
printf("输入一个正整数:");
scanf("%d",&num);
zhishu(num);
printf("\n");
return 0;
}
#include <stdio.h>
void zhishu (int a)
{
int i,j,k,s,num[10000],b[10000];
for(i=2;i<a;i++)
num[i]=i;
printf("%d以内的质数为:",a);
for(;a>1;)
{
for(i=2,j=2;i<a;i++,j++)
b[j]=a%num[i];
s = 1;
for(j=2;j<a;j++)
{
//s*=b[j];
if(b[j] == 0)
{
s = 0;
break;
}
}
if(s!=0)
printf("%d ",a);
a--;
}
}
int main()
{
int num;
printf("输入一个正整数:");
scanf("%d",&num);
zhishu(num);
printf("\n");
return 0;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
void zhishu (int a)
{
int i,j,num[10000],b[10000];
double s;//定义成double
for(i=2;i<a;i++)
num[i]=i;
printf("%d以内的质数为:",a);
for(;a>1;)
{
for(i=2,j=2;i<a;i++,j++)
b[j]=a%num[i];
for(s=1,j=2;j<a;j++)
{
s*=b[j];
}
if(s!=0)
printf("%d ",a);
a--;
}
}
只要把s定义成double就行,因为你要考虑b[i]乘积会超过int范围,使用double完全能容纳进去。
{
int i,j,num[10000],b[10000];
double s;//定义成double
for(i=2;i<a;i++)
num[i]=i;
printf("%d以内的质数为:",a);
for(;a>1;)
{
for(i=2,j=2;i<a;i++,j++)
b[j]=a%num[i];
for(s=1,j=2;j<a;j++)
{
s*=b[j];
}
if(s!=0)
printf("%d ",a);
a--;
}
}
只要把s定义成double就行,因为你要考虑b[i]乘积会超过int范围,使用double完全能容纳进去。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-03-07
展开全部
恩~不错
我进来了~
|黑 信| 发现问题已经解决了
|吧 息| 那我还说神马呢
|安 来| 广 如果你愿意采纳我的我很高兴
|全 源| 告 不过我左边讲的都是真的
|网 :| 神马都是浮云~
努力就会有收获////////////////////////
!!
我进来了~
|黑 信| 发现问题已经解决了
|吧 息| 那我还说神马呢
|安 来| 广 如果你愿意采纳我的我很高兴
|全 源| 告 不过我左边讲的都是真的
|网 :| 神马都是浮云~
努力就会有收获////////////////////////
!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
s*=b[j];执行次数太多,可能会导致int型的s过大。此外,验证质数,验证到a/2就足够了吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询