繁体   English   中英

返回给定数字前的所有素数(Homework C ++)

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

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

编码

#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;

要获取std::stringanswer ,请使用answer.str()

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

如果您必须在打印之前存储完整的输出(我可能会按照我的方式打印它,但由您决定),一种简单的方法是使用stringstream

在这种情况下,我们可以将其更改为std::stringstream (并包含<sstream>标头),而不是answerstd::string

现在而不是:

answer += i;

我们可以做一个简单的改变,并有:

answer << i;

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

所以基本上,你的代码中的+=会变成<<

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

answer << a << b


现在要将你的stringstream打印到cout ,你需要做的就是:

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的+运算符接受字符串作为参数,指向字符数组的指针或单个字符。

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

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

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

作为旁注,您应该收到来自C ++编译器的警告,当您将整数i添加到字符串时,您的整数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,......)。 随意将您的结果与First 1000 Primes进行比较。

祝好运

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM