手头的问题:编写一个函数primeTableInRange来生成一个表,以显示从startNum到endNum范围内的每个数字是否为素数。当数字不是素数时,我们只会显示'*'。当数字是素数时,我们将显示数字。
我的代码:
#include <iostream>
#include <ctime>
#include <cmath>
#include <cstdlib>
using namespace std;
int primetableinarray(int userarray[], int arraysize);
int main()
{
int startNum, endNum;
cout<< "Enter your first number in the range" << endl;
cin>>startNum;
cout<< "Enter your last number in the range" << endl;
cin>>endNum;
int arraysize = endNum - startNum;
int userarray[arraysize];
for (int i=startNum;i<=endNum;i++)
userarray[i]= startNum++;
primetableinarray(userarray, arraysize);
return 0;
}
int primetableinarray(int userarray[], int arraysize)
{
for (int i=2;i<arraysize;i++)
{
bool prime=true;
for (int r=2;r*r<i;r++)
{
if (i % r ==0)
{
prime=false;
break;
}
}
if(prime) cout << i << endl;
else
if(true) cout<< "*" << endl;
}
}
问题是它没有从&#34; startNum&#34;开始。并且不会以&#34; endNum&#34;结束。它实际上从0到数组化。它还计算4作为素数。我在这里缺少什么?
答案 0 :(得分:1)
小心!在您的情况下,数组始终从0开始并以arraysize
结束。你不能有任意索引。您可以执行以下操作:
int arraysize = endNum - startNum + 1;
int userarray[arraysize];
for (int i=0;i<arraysize;i++)
userarray[i]= startNum+i;
此外,由于我们从0开始,你需要在'arrayize'中添加+1以在'useraray'中加入'endNum'
答案 1 :(得分:0)
尝试改变这一点 从:
for (int r=2;r*r<i;r++)
到
for (int r=2;r<i;r++)
答案 2 :(得分:0)
#include <iostream>
#include <ctime>
#include <cmath>
#include <cstdlib>
using namespace std;
int primetableinarray(int userarray[], int arraysize);
int main()
{
int startNum, endNum;
cout<< "Enter your first number in the range" << endl;
cin>>startNum;
cout<< "Enter your last number in the range" << endl;
cin>>endNum;
int arraysize = endNum - startNum + 1;
int userarray[arraysize];
for (int i=startNum;i<endNum;i++)
userarray[i]= startNum++;
primetableinarray(userarray, arraysize);
return 0;
}
int primetableinarray(int userarray[], int arraysize)
{
for (int i=2;i<=arraysize;i++)
{
bool prime=true;
for (int r=2;r<i;r++)
{
if (i % r ==0)
{
prime=false;
break;
}
}
if(prime) cout << i << endl;
else
if(true) cout<< "*" << endl;
}
}
答案 3 :(得分:0)
您的打印功能无处可识别您的阵列。您只需开始将数字循环到您的数组大小。如果你从函数参数中取出数组它仍然可以工作,那你为什么要包括它呢?你的for循环只是忽略你的数组中的任何值,并从2任意开始循环。
至于为什么4被计算为素数,这是因为当你的第二个循环开始时它看到2 * 2 = 4,因此不小于4,这是你正在测试的数字。这导致它跳过循环并且从不将prime设置为false。将第二个for循环中的条件设为&lt; =否则任何没有其他因子的完美正方形都将被标记为素数,例如25。
另外在旁注,这怎么编译?您使用dynaimc变量来启动数组大小。这不起作用,当我试图运行你的代码看到输出我有错误。尝试使用std::vector<int>
。当您使用for循环填充向量时,您使用值作为索引,这是完全错误的。这是你应该从零循环到你的数组大小,因为它是数组中的地址。您还会添加ctime
和cmath
等不必要的标头,并且代码中的if(true)
无理由。
答案 4 :(得分:0)
数组(int userarray[arraysize];
)的声明是非法的,需要在编译时知道数组边界。这甚至不应该编译,或者它产生一个零大小的数组
之后,您随机访问未分配的内存,即UB
答案 5 :(得分:0)
更改
int arraysize = endNum - startNum + 1;
int userarray[arraysize];
要
int userarray[1];
int arraysize = endNum - startNum;
userarray[arraysize];
另外,在primetableinarray函数中添加一个返回值。
答案 6 :(得分:0)
Here is the correct program .
#include <iostream>
using namespace std;
void primetableinarray(int low, int high) ;
int main()
{
int low, high, i, flag;
cout<< "Enter low numbers ";
cin>> low;
cout<< "Enter high numbers ";
cin>>high;
cout<< "Prime numbers between " << low << "and are: " << high <<endl;;
primetableinarray(low, high);
return 0;
}
void primetableinarray(int low, int high) {
int i, flag;
while (low <= high)
{
flag = 0;
for(i = 2; i <= low/2; ++i)
{
if(low % i == 0)
{
flag = 1;
break;
}
}
if (flag == 0)
cout<< low <<endl;
else
cout<< "*" <<endl;
++low;
}
}
Output :
Enter low numbers 1
Enter high numbers 10
Prime numbers between 1and are: 10
1
2
3
*
5
*
7
*
*
*
您的代码中存在一些问题:
int arraysize = endNum - startNum; int userarray [arraysize];
如何编译,这将是编译错误。你可以动态分配内存并使用它。
for(int i = startNum; i&lt; = endNum; i ++) userarray [i] = startNum ++;
如果您要比较“i&lt; = endNum”,这是错误的i = startNum和arraysize = arraysize +1。
正确的方法是:
for(int i = 0; i&lt; = endNum; i ++) userarray [i] = startNum ++;