c++ 程序 return "0 0" 而不是 returning 质数。为什么它不能从 "prime" 函数得到正确的输出?
c++ program return "0 0" instead of returning prime numbers. Why does it not get the correct output from the "prime" function?
我的函数“prime”接受一个动态数组和 returns 一个仅由质数组成的动态分配数组。但是当它返回到 main 时,它给出了错误的输出和 print
输出:
0 0
预期输出:
2 3
我的代码:
#include<stdio.h>
#include<math.h>
#include <cstdio>
#include<iostream>
using namespace std;
const int capacity = 10000;
int * prime(int numbers[capacity])
{
int *primeArray;
primeArray = new int[capacity];
int lenghtOfArray=sizeof(primeArray)/sizeof(int);
int counter = 0;
for(int index=0;index<lenghtOfArray;index++){
// 0 and 1 are not prime numbers
if (numbers[index] == 0 || numbers[index] == 1) {
continue;
}
else {
for (int i = 2; i <= numbers[index] / 2; ++i) {
if (numbers[index] % i == 0) {
primeArray[counter] = numbers[index];
counter = counter + 1;
break;
}
}
}
}
return primeArray;
}
main()
{
int *mynumbers;
mynumbers = new int[capacity];
mynumbers[0] = 1;
mynumbers[1] = 2;
mynumbers[2] = 3;
mynumbers[3] = 4;
mynumbers[4] = 5;
mynumbers[5] = 6;
int* myprime = prime(mynumbers);
cout << myprime[0] << " " << myprime[1];
}
出了什么问题?
int lenghtOfArray=sizeof(primeArray)/sizeof(int);
是获取动态分配数组长度的错误方法。
sizeof(primeArray)
不是分配的大小而是指针的大小
你已经有了数组元素的数量,所以用它来得到数组的长度:
int lenghtOfArray=capacity;
但这并不能使您的代码正确,因为现在您的代码将使用 int
数组的未初始化元素的不确定值。你要做的就是将有效元素的数量传递给函数。
要更改的点数:
// add argument to pass the number of data
// int * prime(int numbers[capacity])
int * prime(int numbers[capacity], int num_numbers)
{
int *primeArray;
primeArray = new int[capacity];
// use the passed number
// int lenghtOfArray=sizeof(primeArray)/sizeof(int);
int lenghtOfArray=num_numbers;
// pass the number of data
// int* myprime = prime(mynumbers);
int* myprime = prime(mynumbers, 6);
cout << myprime[0] << " " << myprime[1];
}
另一点是您的代码存储的不是质数而是质数。
而不是这个
for (int i = 2; i <= numbers[index] / 2; ++i) {
if (numbers[index] % i == 0) {
primeArray[counter] = numbers[index];
counter = counter + 1;
break;
}
}
你应该使用这个
// add the number for now
primeArray[counter] = numbers[index];
counter = counter + 1;
for (int i = 2; i <= numbers[index] / 2; ++i) {
if (numbers[index] % i == 0) {
// it is not actually a prime, rollback
counter = counter - 1;
break;
}
}
我的函数“prime”接受一个动态数组和 returns 一个仅由质数组成的动态分配数组。但是当它返回到 main 时,它给出了错误的输出和 print
输出:
0 0
预期输出:
2 3
我的代码:
#include<stdio.h>
#include<math.h>
#include <cstdio>
#include<iostream>
using namespace std;
const int capacity = 10000;
int * prime(int numbers[capacity])
{
int *primeArray;
primeArray = new int[capacity];
int lenghtOfArray=sizeof(primeArray)/sizeof(int);
int counter = 0;
for(int index=0;index<lenghtOfArray;index++){
// 0 and 1 are not prime numbers
if (numbers[index] == 0 || numbers[index] == 1) {
continue;
}
else {
for (int i = 2; i <= numbers[index] / 2; ++i) {
if (numbers[index] % i == 0) {
primeArray[counter] = numbers[index];
counter = counter + 1;
break;
}
}
}
}
return primeArray;
}
main()
{
int *mynumbers;
mynumbers = new int[capacity];
mynumbers[0] = 1;
mynumbers[1] = 2;
mynumbers[2] = 3;
mynumbers[3] = 4;
mynumbers[4] = 5;
mynumbers[5] = 6;
int* myprime = prime(mynumbers);
cout << myprime[0] << " " << myprime[1];
}
出了什么问题?
int lenghtOfArray=sizeof(primeArray)/sizeof(int);
是获取动态分配数组长度的错误方法。
sizeof(primeArray)
不是分配的大小而是指针的大小
你已经有了数组元素的数量,所以用它来得到数组的长度:
int lenghtOfArray=capacity;
但这并不能使您的代码正确,因为现在您的代码将使用 int
数组的未初始化元素的不确定值。你要做的就是将有效元素的数量传递给函数。
要更改的点数:
// add argument to pass the number of data
// int * prime(int numbers[capacity])
int * prime(int numbers[capacity], int num_numbers)
{
int *primeArray;
primeArray = new int[capacity];
// use the passed number
// int lenghtOfArray=sizeof(primeArray)/sizeof(int);
int lenghtOfArray=num_numbers;
// pass the number of data
// int* myprime = prime(mynumbers);
int* myprime = prime(mynumbers, 6);
cout << myprime[0] << " " << myprime[1];
}
另一点是您的代码存储的不是质数而是质数。
而不是这个
for (int i = 2; i <= numbers[index] / 2; ++i) {
if (numbers[index] % i == 0) {
primeArray[counter] = numbers[index];
counter = counter + 1;
break;
}
}
你应该使用这个
// add the number for now
primeArray[counter] = numbers[index];
counter = counter + 1;
for (int i = 2; i <= numbers[index] / 2; ++i) {
if (numbers[index] % i == 0) {
// it is not actually a prime, rollback
counter = counter - 1;
break;
}
}