簡體   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