【发布时间】: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何时递增(2、3或7不会递增,但6会递增两次)。 -
"can start at 1 too"
v[20]创建一个包含 20 个元素的数组,索引从 0 到 19。以 1 开始索引意味着跳过第一个元素。访问t[20]越界并导致未定义的行为,通常是程序崩溃。 -
@ThomasSablik 我用
1开始了数组,因为我把i<=a和j<=a放在那里,所以我看不到问题。 -
@paokv "也可以从 1 开始" - 不,他们不能。如果您这样访问它们,您将访问导致内存损坏和各种未定义行为的不良元素。