2017-07-27 53 views
-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; 
} 

它看起來就像是缺少兩個值,我要進行總結。 基本上總和之間的總的所有素數的10^12至10^12 + 10^5

+3

找出哪個程序是正確的,然後調試不正確的程序。 – Carcigenicate

+3

專業提示:正確地格式化您的代碼會使調試更容易。 –

+0

程序1的輸出是期望的輸出。 –

回答

0

當創建自動陣列和動態分配的一個在此代碼:

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

它們unintialized。稍後,您從b讀取:

if(b[i]==1) 

它導致UB。你做這個代碼分配一定的參考價值a

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

,但如果所有的數據被分配目前尚不清楚。如果沒有進一步閱讀,也會導致UB。您應該在使用之前初始化數據以消除UB並停止獲得不可預知的結果。

PS根據註釋掉的代碼嘗試初始化a,但這樣做還不夠,b也必須初始化。

注意:由new[]分配的內存應該由delete[]發佈,儘管這在您的代碼中並不是問題的根源。您最好使用std::vector,它不僅可以處理內存分配,還可以正確初始化數據。

0

好,我知道它背後的邏輯,當我不intialize陣列,它需要的時候可能是1和0的垃圾也值,因爲被檢查

如果(A [1]!= 1 ) {

sum=sum+i+x; 


} 

所以由於A [1]是被投入垃圾值== 1,我是越來越錯誤的答案。 運行此垃圾值

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

看,1 **,但仍沒有不知道,爲什麼COUT聲明更正它? **

相關問題