2011-11-09 7 views
1

私は多くの研究をして自分自身でプログラムしようとしていますが、問題に直面して宿題を手伝ってくれるように頼んでいません。私は、問題がある場合、これまで私が知ってたと思うが、まだ何の解決策は、私が把握することはできない。与えられた数字の前にすべての素数を返します(宿題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)このプログラムw (例えば、ユーザ入力9:答えが2、3、5、7である場合)、その前にすべての素数を返す。

2)私は、文字列、int型の連結演算子として+を使用することに慣れてるので、前のJavaScriptプログラマ(++今まで私はまだCの文字列と整数をCONCATする方法をパズル、間違った部分は文字列と整数の連結だと思います)

3.上記の問題の横にあるが、これまでのところ、コードを調べて、他の問題は見つかっていない。何人かの専門家が私を啓発するためにそれを指摘することができますか?

4.)コーディングやアルゴリズムなど何か間違いがあった場合は、私には何か間違いがありますので、躊躇しないでください。私は喜んで学びます。時間を過ごすための

おかげで

+0

エラーは何ですか?何が印刷されますか? – talnicolas

+0

あなたが期待している答えの代わりにあなたは何を提供しますか? – rcollyer

+0

すべてを文字列に入れる必要はありますか?各素数が見つかると簡単に印刷できます。回線回答+ = iの場合は – madth3

答えて

3

私の質問を読んでC++の書式を実行するための通常の方法はstreamsを使用することです。

この状況では、std::stringstreamを使用して結果を累積し、最後に印刷するときに文字列に変換できます。

は、必要な型および機能の宣言を取得するためにsstreamを含める:あなたが持っているところはどこでも、その後

stringstream answer; 

と::

#include <sstream> 

ではなくstd::stringstd::stringstreamするanswerを宣言

answer += bla; 

、repla std::stringanswerの外を取得するには

answer << bla; 

answer.str()を使用します:とCEそれを

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

あなたはちょうどあなたがこれまで持っているもの印刷する場合は、文字列の連結の問題を回避行くことができます:

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

他の方法として、連結を行う方法の1つはstd :: stringstreamです。

1

完全な出力を印刷する前に保存しなければならない場合は、私が行ったときに印刷しますが、あなた次第ですが、簡単な方法はstringstreamです。この場合

、むしろanswerstd::stringことより、我々はstd::stringstreamに変更(および<sstream>ヘッダを含む)ことができます。

ではなくなる:

answer += i; 

我々は単純な変更を加えると持つことができます。

answer << i; 

ちょうどあなたと同じように、あなたが(ostreamある)coutに印刷された場合。

基本的に、コード内の+=<<になります。 coutへの印刷と同様に

、あなたもチェーン一緒のようなことができます。

answer << a << b 


があなたのstringstreamcoutに印刷するには、あなたがする必要があると思いますすべてがある:

cout << my_stringstream.str() 


どうぞ。私は宿題なので、あなたに完全なものを提供したくありません。

0

非常に美しいわけではありませんが、機能します。私は一般的なライブラリ "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; 
     } 
    } 
} 
0

あなたが使用してTnは(正確には、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++) 
{ 
+0

itoaとsprintfをC++で回避しますが、itoaは非標準関数でsprintfあなたのstdlibがそれをサポートしていれば、安全なバージョンを使うべきです –

+0

sprintfの安全なバージョンはどういう意味ですか? –

+0

sprintfには、この厄介な機能があり、バッファにオーバーフローさせることができます。セキュアバージョンは、バッファに入れる '\ 0'を含む最大長を指定する追加パラメータをとります。私はMicrosoftがsprintf_sを呼び出し、C99がsnprintfと宣言しているようだ –

0

問題は、スタンダード::文字列の+演算子は文字、または単一文字の配列へのパラメータとして文字列のポインタを受け入れることです。

+演算子で1つのcharを使用すると、文字列の最後に1つのcharが追加されます。

C++コンパイラは、整数をcharに変換してからoperator +に渡します(charとintの両方が異なるビット番号の符号付き整数値です)。したがって、文字列には数字の代わりに奇妙な文字が含まれている必要があります。

あなたが明示的に他の回答で提案されているように、文字列に追加する前に、整数を文字列に変換したりはstdするだけの出力にすべて必要があります:: coutを(そのオペレータ< <は、パラメータとしてint型や文字列にそれらを正しく変換受け入れます)。

C++コンパイラから、整数iが文字列に追加されたとき(整数が低解像度などに変換されている)にcharに変換されたという警告が表示されます。このため、警告レベルを高く設定し、コンパイル中に警告を生成しないアプリケーションを作成することは常に有効です。

0

既知の素数をsetに保存することで、より高速な検索が可能です。これらの2つのサンプル関数は、トリックを行う必要があります。

#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 String Algorithms Libraryを使用して、文字列/シーケンスの結合アルゴリズムと分割アルゴリズムの両方を実行できます。

このソリューションは完璧ではありませんが、基本的なC++の使用法(単純なコンテナ、構造体なし、1つのtypedefなど)です。 The First 1000 Primesとあなたの結果を自由に比較してください。

幸運

関連する問題