我昨天开始读一本关于C++的书。到目前为止,我已经写了 100 页,并用这个数字来编写我的第一个程序。我想让它找出给定的数字是否是素数。
我有两个问题。
我知道我的方法并不好。该程序正在检查每个数字,这使得程序变得很大。做到这一点的理想方法是什么?我是否理解你的答案并不重要,我稍后会简单地阅读命令:)。
我的
"Result+=1"
线遇到了很大的问题。起初我有 i=1
,这给了我以下数字 7
的结果。
1111112
嗯,我也知道为什么。对于前 6 个 for 循环,他找到了一个数字
(1)
,对于最后一个 2(1,7)
,他找到了一个数字。但这显然不是我想要的。我希望 Result 成为某种计数器。我该怎么做?
代码:
#include <iostream>
using namespace std;
// Hauptprogramm
int main ()
{
// Variablen
int Prime_number;
int Result = 0;
// Abfragen
cout << "Please enter possible prime number: ";
cin >> Prime_number;
// Rechnen
for (int i=2; i <= Prime_number ; i++)
{
if (Prime_number%i == 0)
{
Result +=1;
}
}
// Ausgabe
if(Result == 1)
{
cout << "You got a prime number!" << endl;
}
else
{
cout << "No luck" <<endl;
}
return 0;
}
你的逻辑很奇怪,而且正如你所说,效率很低。这是一个更好的逻辑
检查从 2 到 Prime_number - 1 的每个数字,如果其中任何一个能整除,那么它就不是素数,否则就是。重要的一点是,找到一个除数后就不再寻找,因为这样你就知道问题的答案了。这是一些执行此操作的代码
bool prime = true;
for (i = 2; i < Prime_Number; ++i)
{
if (Prime_Number % i == 0)
{
prime = false;
break;
}
}
if (prime)
cout << "You got a prime number!" << endl;
else
cout << "No luck" <<endl;
我认为您在尝试中错过的两点是使用
bool
变量,以及一旦知道循环完成就可以
break
退出循环。顺便说一句,这段代码可以进一步改进,但这对你来说是一个练习。
#include<iostream>
#include<algorithm>
bool isprime(int a)
{
int count=0;
for(int i=2;i<sqrt(a);i++)
{
if(a%i==0)
{count++;}
}
if(a==1||count!=0) return false;
else return true;
}
int main()
{
int a;
cin>>a;
if(isprime(a))
{
cout<<"number is prime";
}
else cout<<"number is not prime";
return 0;
}
如您所见,这会成倍减少 isprime 函数中的测试用例数量,从而使代码更加高效。 希望这有帮助。
为什么我从 i=2 开始?
我对素数的定义是一个有 2 个因数的数:1 和它本身。因此,当您从一个开始时,您(正确的)会计算一个额外的因子,因为 prime_number 可以被 1 整除。这会为您提供结果计数 2,因为它找到了两个因子。
有什么更好的方法吗?
有几种更好的方法,其中一些方法明显更复杂;然而,您现在拥有的算法可以通过几种直接方式轻松改进:
#include "time.h"
#include "iostream"
#include "conio.h"
using namespace std;
int main()
{
div_t divresult;
time_t t1,t2;
t1 = time(NULL);
int prime[1501] = {0};
prime[1] = 2;
prime[2] = 3;
prime[3] = 5;
prime[4] = 7;
prime[5] = 11;
int count = 6;
for(int i = 12; count < 1500; i +=1)
{
bool Bprime = true;
for(int j = 1; j < count; j+=1)
{
if(i%prime[j] == 0) Bprime = false;
}
if(Bprime == true) prime[count++] = i;
}
t2 = time(NULL);
divresult = div(t2-t1,60);
cout<<divresult.quot <<" min "<<divresult.rem<<" sec"<<endl;
int n = 0;
cout<<"Give Value of N:";
cin>> n;
cout<<n<<"th prime is: "<<prime[n-1]<<endl;
_getch();
return 0;
}
#include <stdio.h>
#include <cmath>
bool BePrime(unsigned int N){
if(N == 2) return true;
for(int i = 2; i <= int(sqrt(N)); i++) {
if(N%i == 0) return false;
}
return true;
}
main(){
int a;
while(scanf("%d",&a)){
if(BePrime(a)) {
printf("%d is Prime\n", a);
continue;
}
printf("%d is not Prime\n", a);
}
}
> int main() {
int i = 2 , n, halfn;
cin>>n;
halfn = n / 2;
while(halfn > i) {
if(n % i == 0) {
cout << n << " Is NOT A Prime Number" << endl;
break;
}
i++;
if(halfn <= i ) {
cout << n << " Is A Prime Number" << endl;
}
}
return 0; }