返回给定数字之前的所有质数(家庭作业C++)

Return all prime number before a given number(Homework C++)

本文关键字:家庭作业 C++ 数字 返回      更新时间:2023-10-16

我不是想请你们帮我做作业,因为我做了很多研究,也尝试自己编程,但我仍然遇到问题,我想到目前为止我已经知道问题在哪里,但仍然没有解决方案我能弄清楚:

《守则》

#include <iostream>
#include <string>
#include <cmath>
int main(void)
{
 using namespace std;
 int num;
 int max;
 string answer = "";
 cin >> num;
 for(int i = 2 ; i < num ; i++)
 {
     max = sqrt(i);
     if(max < 2) // This must be done beacuse sqrt(2) and sqrt(3) 
     {           // is 1 which will make it become  nonprime.
         answer += i;
         answer += ' ';
         continue;
     }
     for(int j = 2 ; j <= max ; j++) // Trial division ,divide each by integer
     {                               // more than 1 and less than sqrt(oftheinteger)
         if(i % j == 0)
             break;
         else if(j == max)
         {
             answer += i + " ";
             answer += ' ';
         }
     }
  }
         cout <<"The answer is " << answer ;

     return 0;
 }

问题

1.(该程序将提示用户输入一个数字,并返回它之前的所有素数(例如,如果用户输入9:则答案是2,3,5,7(。

2.(我认为错误的部分是字符串和整数连接,直到现在我仍然困惑如何在C++中连接字符串和整数(以前的Javascript程序员所以我习惯于使用+作为string-int concat运算符(

3.(除了我上面提到的问题,到目前为止,我已经浏览了代码,发现不存在其他问题。如果有任何专家设法找到任何,介意指出来启发我??

4.(如果在编码或算法方面有任何错误或我所做的任何事情,请不要犹豫指出来,我愿意学习。

感谢您花时间阅读我的问题

在 C++ 中执行格式化的常用方法是使用 streams

在这种情况下,您可以使用std::stringstream来累积结果,然后在执行最终打印时将其转换为字符串。

包含sstream以获取所需的类型和函数声明:

#include <sstream>

answer声明为std::stringstream而不是std::string

stringstream answer;

然后无论你在哪里:

answer += bla;

,将其替换为:

answer << bla;

要从answer中获得std::string,请使用answer.str()

cout << "The answer is " << answer.str();

如果你必须在打印之前存储完整的输出(我可能会随时打印它,但这取决于你(,一个简单的方法是使用 stringstream s。

在这种情况下,与其answer std::string ,我们可以将其更改为std::stringstream(并包含<sstream>标头(。

现在而不是有:

answer += i;

我们可以进行简单的更改并具有:

answer << i;

就像打印到cout一样(这是一个ostream(。

所以基本上,代码中的+=会变得<< .

与打印类似 cout ,您也可以链接在一起,例如:

answer << a << b


现在要打印stringstreamcout,您需要做的就是:

cout << my_stringstream.str()


看看你怎么走。我不想为您提供完整的,因为它是家庭作业。

如果你只打印到目前为止的内容,你可以绕过字符串连接问题:

int main()
{
 int num;
 int max;
 string answer = "";
 cin >> num;
 cout << "The answer is ";
 for(int i = 2 ; i < num ; i++)
 {
     max = sqrt((double)i);
     if(max < 2) // This must be done beacuse sqrt(2) and sqrt(3) 
     {           // is 1 which will make it become  nonprime.
         cout << i << ' ';
         continue;
     }
     for(int j = 2 ; j <= max ; j++) // Trial division ,divide each by integer
     {                               // more than 1 and less than sqrt(oftheinteger)
         if(i % j == 0)
             break;
         else if(j == max)
         {
            cout << i << ' ';
         }
     }
  }

     return 0;
}

正如其他人提到的,进行串联的一种方法是std::stringstream。

不是很漂亮,但它有效。我使用通用库"genlib.h",我不确定您使用什么,因此您可能需要替换它,或者我可以将其发送给您。

#include "genlib.h"
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
bool IsPrime(int num);
int main()
{
    int num;
    int i = 2;
    cout << "Enter an integer to print previous primes up to: ";
    cin >> num;
    cout << endl << "The primes numbers are: " << endl;
    while(i < num){
        if (IsPrime(i) == true){
            cout << i << ", ";
        } 
        i++;
    }
    return 0;
}
bool IsPrime(int num){
    if((num == 2) || (num == 3)) {
        return true;
    }else if ((num % 2) == 0){
        return false;
    }else{
        for (int i = 3; i < sqrt(double(num))+1; i++){
            if ((num % i) == 0){
                return false;
            } 
            return true;
        }
    }
}

您需要使用以下方法将整数转换为字符串(确切地说是char*(:

answer += itoa(i);

或使用标准功能:

char str[10];
sprintf(str,"%d",i);
answer += str;

如果你想避免使用sqrt函数,你可以替换:

for(int i = 2 ; i < num ; i++)
{
     max = sqrt(i);

跟:

for(int i = 2 ; i*i < num ; i++)
{

问题是 std::string 的 + 运算符接受字符串作为参数、指向字符数组或单个字符的指针。

在 + 运算符中使用单个字符时,会将单个字符添加到字符串的末尾。

您的C++编译器在将整数传递给运算符 + 之前将其转换为 char(char 和 int 都是有符号整数值,具有不同的位号(,因此您的字符串应包含奇怪的 char 而不是数字。

您应该在将整数添加到字符串之前显式转换为字符串,如其他答案中所建议的那样,或者只是将所有内容输出到 std::cout(它的运算符 <<也接受 int 作为参数并将它们正确转换为字符串(。

作为旁注,您应该收到来自C++编译器的警告,指出当您将整数 i 添加到字符串时,它已转换为 char(整数已转换为较低的分辨率或类似的东西(。这就是为什么将警告级别设置为高并尝试生成在编译期间不生成任何警告的应用程序总是好的。

您可以通过将已知的素数存储在set中来执行更快的查找。这两个示例函数应该可以解决问题:

#include <iostream>
#include <set>
#include <sstream>
#include <string>
typedef std::set< unsigned int > PrimeNumbers;
bool isComposite(unsigned int n, const PrimeNumbers& knownPrimeNumbers)
{
    PrimeNumbers::const_iterator itEnd = knownPrimeNumbers.end();
    for (PrimeNumbers::const_iterator it = knownPrimeNumbers.begin();
         it != itEnd; ++it)
    {
        if (n % *it == 0)
            return true;
    }
    return false;
}

void findPrimeNumbers(unsigned int n, PrimeNumbers& primeNumbers)
{
    for (unsigned int i = 2; i <= n; ++i)
    {
        if (!isComposite(i, primeNumbers))
            primeNumbers.insert(i);
    }
}

然后,您可以像这样调用findPrimeNumbers

unsigned int n;
std::cout << "n? ";
std::cin >> n;
PrimeNumbers primeNumbers;
findPrimeNumbers(n, primeNumbers);

如果你真的需要将结果转储到字符串中:

std::stringstream stringStream;
int i = 0;
PrimeNumbers::const_iterator itEnd = primeNumbers.end();
for (PrimeNumbers::const_iterator it = primeNumbers.begin();
     it != itEnd; ++it, ++i)
{
    stringStream << *it;
    if (i < primeNumbers.size() - 1)
         stringStream << ", ";
}
std::cout << stringStream.str() << std::endl;

由于您愿意学习,因此可以使用 Boost 字符串算法库对字符串/序列执行联接和拆分算法。

这个解决方案并不完美,但它是基本的C++用法(简单的容器,没有结构,只有一个typedef,...随意将您的结果与前 1000 个素数进行比较。

祝你好运