C++编程问题 ?以下是求1到100里面所有的素数

#include <iostream>
#include <iomanip>
using namespace std;
#include <cmath>
int main ()
{
int i,j,n,a[101];
for(i=1;i<100;i++)
a[i]=i;
a[1]=0;
for(i=2;i<sqrt(100);i++)
for(j=i+1;j<=100;j++)
{ if(a[i]!=0&&a[j]!=0)// 这一步不明白 为什么要这样设计这步,这步不是多余吗,这里面的数肯定全部都不等于0啦 1到100里面全都是不等于0,
if(a[j]%a[i]==0)
a[j]=0;}
cout<<endl;
for(i=1,n=0;i<100;i++)
{if(a[i]!=0)
{cout<<setw(5)<<a[i]<<" ";
n++;}
if(n==10)
{cout<<endl;
n=0;}
}
cout<<endl;
return 0;
}

在isprime里,你想让它是素数的时候就return,不是素数的时候就不return,然后你在main函数里通过cout的时候如果isprime函数return了就输出,否则就不输出,从而输出所有素数,但是这是不可能实现的,因为isprime函数无论如何都会返回,所以cout无论如何都会输出一些东西,所以正确的方法是isprime返回一个1或0代表是否是素数,然后在主函数里判断一下是否输出。
改成这样:
#include <iostream>
#include <cmath>
using namespace std;
int isprime(int n);
int main(){
int b;
for(int a=3;a<100;a+=2){
b=isprime(a);
if(b)
cout<<a<<'\t';
}
cout<<"是素数"<<endl;
}
int isprime(int n){
int k=int(sqrt(n));
for(int i=2;i<=n;i++){
if(n%i==0)
break;
}
if(i>k)
return 1;
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-05-19
首先抛开你的问题不谈,你这程序无论从代码还是架构上,都显得不够清晰。很多时候,往往正确的路只有一条,错误的路却有千万条,我们没有也不可能有太多的时间去追究所有错误的原因。
不管你这程序是从那借鉴来的,当我看到第一行变量的声明,int i,j,n,a[101];就让人满是不解。第一,变量的声明没有表意性,其次这个程序好像用不到数组吧,纯粹小题大做。
为了不失一般性,可以将问题域设为求某一数值范围内的所有素数。只有两个函数即可完成。
具体代码如下,为了方便使用C语言工具写的。
#include<stdio.h>
#include<string.h>
#include<math.h>
int isPrimeNumber(int number);
void listPrimeNumber(int startNumber,int endNumber);
//驱动程序
void main()
{
listPrimeNumber(1,100);
getch();
}
//列出某一数值范围内的所有素数
void listPrimeNumber(int startNumber,int endNumber){
int i;
for(i=startNumber;i<endNumber;i++)
{
if(isPrimeNumber(i)==1)
printf("%d ",i);
}
}
//测试一个数是否为素数
int isPrimeNumber(int number){
int i;
if(number==1||number==0) return 0;
for(i=2;i<=sqrt(number);i++){
if(number%i==0)
return 0;
}
return 1;
}
第2个回答  2011-05-19
现在你程序简单,可能觉得多余,等以后程序大型了 都得加这个来维护,你以后可以看看比较大型的软件源代码,此类代码很多,看似多余,实则是一个优秀软件程序锁必备的,很强的容错性兼容性,早点养成这个习惯比较好。本回答被提问者采纳
第3个回答  2011-05-19
#include<iostream>
using namespace std;
int main()
{
int i,j,a[100];
for(i=0;i<100;i++)
{
a[i]=i+1;//对a[i]进行赋值
}
for(i=1;i<100;i++)
{
int m =i/2;
if(i%m==0)
continue; //如果=0表示不是素数,进行下一次循环
cout<<a[i]; //是素数就输出
}
return 0;
}

你整的太复杂了吧,求素数很简单的事哎。
建议以后写代码应该带{}的地方全带上,这样会使代码结构清晰,方便修改。追问

你这程序 有问题 你自己先上上机看看 不过还是谢谢你的回答

第4个回答  2011-05-19
if(a[i]!=0&&a[j]!=0) //确保a[i]!=0是因为后面有 a[j]%a[i] 的运算,你的代码是正常情况是不可能
//出现a[i]的值为0,但是对于除法与取余操作,这是必须的
if(a[j]%a[i]==0)
a[j]=0;} //a[j]!=0是因为当a[j]在这里变为0后就说明a[j]不是素数,在j不改变的情况下执行
//后面的for(j=i+1;j<=100;j++)循环时,不用判断a[j]%a[i]==0,因为已经确定不是素数
相似回答