2017-07-27 2 views
-2

プログラム、第2のプログラム1.両方のプログラムの合計の値が最終的に異なるのはなぜですか?

#include<iostream>  
using namespace std;   
    int main() 
{ 
int a[100000]; 
int *b=new int[1000000]; 
//for(int i=0;i<100000;i++) 
//a[i]=0; 
long long int sum=0; 
const long long int x=1000000000000ll; 
for(long long int i=2;i<1000000;i++) 
{ 

    if(b[i]==1) 
    continue; 
    for(long long int j=i*i;j<1000000;j+=i) 
    b[j]=1; 

    long long int k=((x-1)/i+1)*i-x; 
//Sieve upto 10^12+10^5 
for(;k<100000;k+=i) 
    a[k]=1; 
} 

for(int i=0;i<100000;i++) 
{ 
    if(a[i]!=1) 
    { 
    cout<<i+x<<" "<<i%1000<<endl; 
     sum=sum+i+x; 


    } 

} 

cout<<"sum="<<sum; 
} 

を、私はそれがプログラム内の和の値を変更して合計を印刷する前に、いくつかの値を印刷しています。誰が私になぜこれが起こっているのか教えてもらえますか?それは私が要約するつもりです二つの値が欠落しているように見えます プログラム2

#include<iostream> 
    using namespace std; 
    int main() 
{ 
int a[100000]; 
int *b=new int[1000000]; 
//for(int i=0;i<100000;i++) 
//a[i]=0; 
long long int sum=0; 
const long long int x=1000000000000ll; 
for(long long int i=2;i<1000000;i++) 
{ 

    if(b[i]==1) 
    continue; 
    for(long long int j=i*i;j<1000000;j+=i) 
    b[j]=1; 

    long long int k=((x-1)/i+1)*i-x; 
//Sieve upto 10^12+10^5 
for(;k<100000;k+=i) 
    a[k]=1; 
} 

for(int i=0;i<100000;i++) 
{ 
    if(a[i]!=1) 
    { 

     sum=sum+i+x; 


    } 

} 

cout<<"sum="<<sum; 
} 

。 あなたは自動配列を作成し、動的にこのコード内の1つの割り当てられた場合には、基本的に合計が5^10 + 12^10に

+3

どのプログラムが正しいのか分かり、不正なものをデバッグしてください。 – Carcigenicate

+3

Proのヒント:コードを正しくフォーマットすると、デバッグが容易になります。 –

+0

プログラム1の出力は望ましい出力です。 –

答えて

0

10^12の間のすべての素数の合計である:それらがいないに関わらずさ

int a[100000]; 
int *b=new int[1000000]; 

を。その後、b

if(b[i]==1) 

からUBにつながります。あなたは、このコードでaにいくつかの値を代入行います

for(;k<100000;k+=i) 
    a[k]=1; 
} 

が、すべてのデータが割り当てられているかどうかは明らかではありません。それ以上読むことができない場合は、UBにもつながります。 UBを削除して予期しない結果が得られなくなる前に、データを初期化する必要があります。

PS aを初期化しようとしたコメントアウトコードによるが、これでは不十分であるため、bも初期化する必要があります。

注:new[]によって割り当てられたメモリは、delete[]によって解放される必要がありますが、それはあなたのコードでは問題の原因ではありません。 std::vectorを使用するほうが、メモリ割り当てを処理するだけでなく、データを適切に初期化することをお勧めします。 1も0であるかもしれないとき([i]の場合

のためにチェックしていたので、私は配列をintializeないとき

0

いいが、私は、その背後にあるロジックを持って、それは、ゴミ値を取る!= 1ガベージ値によって置かれそうに起因[i]を== 1){

sum=sum+i+x; 


} 

は、私が間違った答えを得ていました。これは**ごみ値

#include<iostream> 
using namespace std; 
int main() 
{ 
int a[100000]; 
for(int i=0;i<100000;i++) 
cout<<a[i]<<endl; 
} 

によって1を参照するのではなく、coutの文は、それを修正する理由はまだ、何のアイデアを持っていません 実行?? **