2017-07-27 3 views
-2

programme 1.Pourquoi les valeurs de somme dans les deux programmes sont-elles différentes à la fin?

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

Dans le deuxième programme quand je suis en train d'imprimer des valeurs avant l'impression somme il est en train de changer la valeur de somme dans le programme. Quelqu'un peut-il me dire pourquoi cela se passe-t-il? programme 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; 
} 

On dirait qu'il manque deux valeurs que je vais résumer. essentiellement somme est le total de tous les nombres premiers entre 10^12 à 10^12 + 10^5

+3

Déterminez quel programme est correct, puis déboguez le programme incorrect. – Carcigenicate

+3

Astuce Pro: le formatage de votre code correctement, il sera plus facile de déboguer. –

+0

La sortie du programme 1 est la sortie désirée. –

Répondre

0

Lorsque vous créez tableau automatique et dynamique attribué un dans ce code:

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

ils sont unintialized. Plus tard, vous lisez b:

if(b[i]==1) 

qui conduit à UB. Vous n'attribuez une valeur à a dans ce code:

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

mais il ne sait pas si toutes les données sont affectées. S'il n'y a pas d'autres lectures, cela mène également à UB. Vous devez initialiser vos données avant d'utiliser pour éliminer UB et cesser d'obtenir des résultats imprévisibles. PS en fonction du code commenté que vous avez essayé d'initialiser a, mais ce ne serait pas suffisant, b doit également être initialisé.

Remarque: la mémoire allouée par new[] doit être libérée par delete[], bien que cela ne soit pas la source de problème dans votre code. Vous feriez mieux d'utiliser std::vector qui non seulement s'occupe de l'allocation de mémoire, mais qui initialise correctement vos données.

0

d'accord, je suis la logique derrière elle, quand je n'intialize tableau, il prend des valeurs de déchets quand peut-être 1 et 0 aussi, car vérifiait pour

si (a [i]! = 1) {

sum=sum+i+x; 


} 

donc en raison de l'a [i] == 1 qui été mis en valeur des déchets, je recevais une mauvaise réponse. lancer pour voir 1 par la valeur des ordures

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

** mais ne pas aucune idée, pourquoi la déclaration de Cout a corrigé ?? **