显示质数
Display prime number
我在下面编写的这个程序用于显示用户键入的列表(20 个数字)中的质数。但它只能将 2 和 3 检测为质数。我不知道为什么它不起作用。请告诉我错误在哪里,并帮助我改进它。 TQ.
#include <iostream>
#include <conio.h>
using namespace std;
void main ()
{
int i,number,list[20];
int t,p,prime=0;
cout<<"please key 20 numbers from 0 to 99"<<endl;
for(i=1;i<21;i++)
{
cin>>number;
if((number<0)||(number>99))
{
cout<<"Please key in an integer from 0 to 99"<<endl;
}
list[i]=number;
}
for(p=1;p<21;p++)
{
for(t=2;t<list[p];t++)
{
if ( list[p]%t==0)
{
prime=prime+1;
}
}
if (prime==0&&list[p]!=1)
{
cout<<"Prime numbers:"<<list[p]<<endl;
}
}
getch();
}
检查这个
#include<stdio.h>
int main()
{
int n, i = 3, count, c;
printf("Enter the number of prime numbers required\n");
scanf("%d",&n);
if ( n >= 1 )
{
printf("First %d prime numbers are :\n",n);
printf("2\n");
}
for ( count = 2 ; count <= n ; )
{
for ( c = 2 ; c <= i - 1 ; c++ )
{
if ( i%c == 0 )
break;
}
if ( c == i )
{
printf("%d\n",i);
count++;
}
i++;
}
return 0;
}
如果有人输入“123”或“-15”,您的代码会发生什么情况?检查并查看是否可以修复错误。
当你解决了这个问题后,我们可以查看你的素数检查代码。提示:网络上有很多主要的测试代码示例。
所以您的代码存在一些问题,但解决您问题的方法很简单。
当你从 p 的下一次迭代开始时,你不会重置素数的值,因此在我们检测到第二个素数后它总是 > 0,你将永远不会再打印出来。
改变这个:
for(p=1;p<21;p++)
{
for(t=2;t<list[p];t++)
{
if ( list[p]%t==0)
{
prime=prime+1;
}
}
if (prime==0&&list[p]!=1)
{
cout<<"Prime numbers:"<<list[p]<<endl;
}
}
为此(我添加了一些括号以确保清晰度,因此我们确定条件的计算符合我们的预期):
for(p=0;p<20;p++)
{
for(t=2;t<list[p];t++)
{
if ( list[p]%t==0)
{
prime=prime+1;
}
}
if ( (prime==0) && (list[p]!=1) )
{
cout<<"Prime numbers:"<<list[p]<<endl;
}
prime = 0;
}
你的问题就解决了。
但是:我想重申这并不能解决您所有的代码问题。确保你非常仔细地考虑输入部分和循环的内容(为什么 p 是 1 到 21?为什么不是 0 到 20 ;)数组在 C 中是零索引的,这意味着你的 20 个数字列表来自 list[0]到 list[19],你目前正在从 list[1] 循环到 list[20],这实际上超出了范围,我很惊讶你没有遇到段错误!)
更高效的方法
def print_hi(n):
if(n == 1 ):
return False;
if( n == 2 or n == 3):
return True;
if(n % 2 == 0 or n % 3 == 0):
return False;
for i in range (5,n,6):
if( i * i <= n):
if(n % i == 0 or n % (i+2) == 0):
return False
return True
if __name__ == '__main__':
x = print_hi(1032)
print(x)
我在下面编写的这个程序用于显示用户键入的列表(20 个数字)中的质数。但它只能将 2 和 3 检测为质数。我不知道为什么它不起作用。请告诉我错误在哪里,并帮助我改进它。 TQ.
#include <iostream>
#include <conio.h>
using namespace std;
void main ()
{
int i,number,list[20];
int t,p,prime=0;
cout<<"please key 20 numbers from 0 to 99"<<endl;
for(i=1;i<21;i++)
{
cin>>number;
if((number<0)||(number>99))
{
cout<<"Please key in an integer from 0 to 99"<<endl;
}
list[i]=number;
}
for(p=1;p<21;p++)
{
for(t=2;t<list[p];t++)
{
if ( list[p]%t==0)
{
prime=prime+1;
}
}
if (prime==0&&list[p]!=1)
{
cout<<"Prime numbers:"<<list[p]<<endl;
}
}
getch();
}
检查这个
#include<stdio.h>
int main()
{
int n, i = 3, count, c;
printf("Enter the number of prime numbers required\n");
scanf("%d",&n);
if ( n >= 1 )
{
printf("First %d prime numbers are :\n",n);
printf("2\n");
}
for ( count = 2 ; count <= n ; )
{
for ( c = 2 ; c <= i - 1 ; c++ )
{
if ( i%c == 0 )
break;
}
if ( c == i )
{
printf("%d\n",i);
count++;
}
i++;
}
return 0;
}
如果有人输入“123”或“-15”,您的代码会发生什么情况?检查并查看是否可以修复错误。
当你解决了这个问题后,我们可以查看你的素数检查代码。提示:网络上有很多主要的测试代码示例。
所以您的代码存在一些问题,但解决您问题的方法很简单。
当你从 p 的下一次迭代开始时,你不会重置素数的值,因此在我们检测到第二个素数后它总是 > 0,你将永远不会再打印出来。
改变这个:
for(p=1;p<21;p++)
{
for(t=2;t<list[p];t++)
{
if ( list[p]%t==0)
{
prime=prime+1;
}
}
if (prime==0&&list[p]!=1)
{
cout<<"Prime numbers:"<<list[p]<<endl;
}
}
为此(我添加了一些括号以确保清晰度,因此我们确定条件的计算符合我们的预期):
for(p=0;p<20;p++)
{
for(t=2;t<list[p];t++)
{
if ( list[p]%t==0)
{
prime=prime+1;
}
}
if ( (prime==0) && (list[p]!=1) )
{
cout<<"Prime numbers:"<<list[p]<<endl;
}
prime = 0;
}
你的问题就解决了。
但是:我想重申这并不能解决您所有的代码问题。确保你非常仔细地考虑输入部分和循环的内容(为什么 p 是 1 到 21?为什么不是 0 到 20 ;)数组在 C 中是零索引的,这意味着你的 20 个数字列表来自 list[0]到 list[19],你目前正在从 list[1] 循环到 list[20],这实际上超出了范围,我很惊讶你没有遇到段错误!)
更高效的方法
def print_hi(n):
if(n == 1 ):
return False;
if( n == 2 or n == 3):
return True;
if(n % 2 == 0 or n % 3 == 0):
return False;
for i in range (5,n,6):
if( i * i <= n):
if(n % i == 0 or n % (i+2) == 0):
return False
return True
if __name__ == '__main__':
x = print_hi(1032)
print(x)