【问题标题】:How to check the prime numbers from a vector in c++?如何从 C++ 中的向量中检查素数?
【发布时间】:2021-03-24 09:06:27
【问题描述】:

我在下面编写了一段代码,要求用户输入向量元素的数量及其元素。我想使用一个函数来检查向量中的素数。例如,我有一个包含 2,6,3,7 作为元素的向量,函数必须检查那里有多少个素数,但输出显示该向量只有 2 个素数。所以,我的问题是:为什么我的代码不起作用?

#include <iostream>

using namespace std;

int input_vector(int a,int t[20]);
int output_vector(int a,int t[20]);
int prime(int a,int nr[20]);

int main()
{
    int i,n,m,v[20],w[20];
    
    cout<<"Enter the number of vector's elements:";
    cin>>n;
    input_vector(n,v); //input vector
   
    cout<<"The vector is: ";
    output_vector(n,v); //output vector
    cout<<endl;
    
    prime(n,v); //prime numbers from vector
    cout<<endl<<endl;
    
    
}

int input_vector(int a,int t[20])
{
    int i;
    for(i=1;i<=a;i++)
    {
        cout<<"v["<<i<<"]=";
        cin>>t[i];
    }
}

int output_vector(int a,int t[20])
{
    int i;
    for(i=1;i<=a;i++) cout<<t[i]<<" ";
}

int prime(int a,int nr[20])
{
    int i,p,j;
    p=0;
    
    for(j=1;j<=a;j++)
        for(i=2;i<=(nr[j]/2);++i)
        {
            if((nr[j]%i==0)) p=p+1;
        }
    
    if(p!=0) cout<<"The vector has "<<p<<" prime numbers.";
    else cout<<"THERE ARE NO PRIME NUMBERS!";
    
}

【问题讨论】:

  • 数组索引从0而不是1开始。
  • 您的prime 函数并没有按照您的想法执行。我建议在调试器中单步执行它,以更好地了解代码在做什么,以及为什么在几个不同的方面出现错误。特别注意p何时递增(237 不会递增,但6 会递增两次)。
  • "can start at 1 too" v[20] 创建一个包含 20 个元素的数组,索引从 0 到 19。以 1 开始索引意味着跳过第一个元素。访问t[20] 越界并导致未定义的行为,通常是程序崩溃。
  • @ThomasSablik 我用1 开始了数组,因为我把i&lt;=aj&lt;=a 放在那里,所以我看不到问题。
  • @paokv "也可以从 1 开始" - 不,他们不能。如果您这样访问它们,您将访问导致内存损坏和各种未定义行为的不良元素。

标签: c++ function vector


【解决方案1】:

查找素数的算法的逻辑流程有误。 我已将其固定在下面,并且还使用了您的方法void,因为它们不返回任何内容。声明但未使用的变量也被删除。

#include <iostream>

using namespace std;

void input_vector(int a,int t[20]);
void output_vector(int a,int t[20]);
void prime(int a,int nr[20]);

int main()
{
    int n,v[20];

    cout<<"Enter the number of vector's elements (between 0 and 19):"; // see comments under OP question
    cin>>n;
    input_vector(n,v); //input vector

    cout<<"The vector is: ";
    output_vector(n,v); //output vector
    cout<<endl;

    prime(n,v); //prime numbers from vector
    cout<<endl<<endl;
}

void input_vector(int a,int t[20])
{
    int i;
    for(i=1;i<=a;i++)
    {
        cout<<"v["<<i<<"]=";
        cin>>t[i];
    }
}

void output_vector(int a,int t[20])
{
    int i;
    for(i=1;i<=a;i++) cout<<t[i]<<" ";
}

// here algorithm to find prime numbers was faulty
void prime(int a,int nr[20])
{
    int i,p,j, counter;        // added a counter
    p=0;

    for(j=1;j<=a;j++) {
        counter = 0;
        if (nr[j] == 0 || nr[j] == 1)  // 0 and 1 are not counted as primes
            counter++;
        for(i=2;i<=(nr[j]/2);++i) {  // if a divisor of nr[j] is found, add 1 to counter
            if (nr[j]%i==0) {
                counter++;
                break;
            }
        }
        if (counter == 0)          // if no divisors found, then +1 primes' count
            p += 1;
    }

    if(p!=0) cout<<"The vector has "<<p<<" prime numbers.";
    else cout<<"THERE ARE NO PRIME NUMBERS!";
}

编辑

根据 OP 的要求,01 现在不会被视为素数。 还添加了一个 break 命令,一旦找到一个除数,并添加一个警告,不要输入超过 19 个数字(由代码中数组 v 的大小施加的限制)。

【讨论】:

  • 谢谢,但我还有一个问题:如何从质数中得到01
  • 你的意思是如果v = {0,1},你希望结果是p = 0,没有找到素数?
  • 是的,我尝试输入两个条件指令(nr[j]==1)||(nr[j]==0)!=,但没有成功。
  • @paokv Done.. 如果您现在发现此答案更有用,请考虑通过单击答案左侧的向上箭头将其标记为有用,谢谢
  • 谢谢!从一开始就标记!
猜你喜欢
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2021-09-12
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多