Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Sabiranje velikih brojeva

[es] :: C/C++ programiranje :: Sabiranje velikih brojeva

[ Pregleda: 4077 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Mil93
Slobodan Milutinovic

Član broj: 301468
Poruke: 26
*.dynamic.isp.telekom.rs.



+1 Profil

icon Sabiranje velikih brojeva08.07.2013. u 19:58 - pre 131 meseci
Pozdrav,radio sam neki zadatak gde se sabiraju veliki brojevi i racuna im se suma.Probao sam preko stringova,ali mi ne radi..
Evo ga kod:

#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAXL 200


int main(){

int n,max,i,j;
char t[MAXL],s[MAXL],p[MAXL];
printf("Unesite koliko brojeva zelite da saberete?");
scanf("%d",&n);
t[MAXL]=0;
p[MAXL]=0;
max=0;

for(i=0;i<n;i++){
gets(s);

if ((strlen(s)-1)>max) max=strlen(s)-1;
for(j=max;j>=0;j--){
t[j]=p[j]+s[j]; //tu mi smesta zbir,to je cifra
if(t[j]>9) {
p[j]=(t[j]%10); //ovo mi racuna prenos cifara
p[j]=t[j];
p[j]=p[j]+1;
}
else{
p[j]=t[j];
}
}
for(j=0;j<=max;j++){
printf("%c",p[j]);
}
printf("je suma.\n");

return 0;
}

Na izlazu mi uvek samo ispise "je suma.",nikad nece sumu,a i nece da mi ucita n brojeva,vec n-1..
Jel bi neko mogao da vidi u cemu je problem,bio bih mu/joj jako zahvalan:)))
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.3gnet.mts.telekom.rs.



+2789 Profil

icon Re: Sabiranje velikih brojeva08.07.2013. u 23:25 - pre 131 meseci
Koristi [ code ] tagove da ubaciš izvorni kod. Evo primedbi:
Code (c):

#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAXL 200

int main()
{
    int n, max, i, j;
    char t[MAXL], s[MAXL], p[MAXL];

    printf("Unesite koliko brojeva zelite da saberete?");
    scanf("%d", &n); // Dodaj \n na kraju formata.
    t[MAXL] = 0; // Ovde je nula ddodeljena nepostojecem elementu van opsega indeksa.
    p[MAXL] = 0; // Takodje.
    // Nizovi t i p nisu inicijalizovani nikakvim vrednostima.
    max = 0;

    for(i = 0; i < n; i++)
    {
        gets(s);

        if ((strlen(s) - 1) > max) max = strlen(s) - 1;

        for(j = max; j >= 0; j--)
        {
            t[j] = p[j] + s[j];

            if(t[j] > 9)
            {
                p[j] = t[j]%10;
                p[j] = t[j]; // Ova nardba ponistava dejstvo prethodne.
                p[j] = p[j] + 1;
                // Kod je u ovom slucaju pogresan.
            }
            else
            {
                p[j] = t[j];
            }
            // U svakoj iteraciji moras voditi racuna o izracunavanju prenosa koji se koristi u sledecoj iteraciji.
        }
    }

    for(j = 0; j <= max; j++)
    {
        printf("%c", p[j]); // Ne ispisuje nista pametno. Znak 0 se pise '0' i ima vrednost 48.
    }

    printf("je suma.\n");

    return 0;
}

Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Mil93
Slobodan Milutinovic

Član broj: 301468
Poruke: 26
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Sabiranje velikih brojeva09.07.2013. u 11:04 - pre 131 meseci
Evo sad sam malo izmenio,ali opet imam isti problem kao i pre..

Code:


#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAXL 200

int main(){
int n,max,i,j,a=0;
char s[MAXL];
int t[MAXL];
               
         printf("Unesite koliko brojeva zelite da saberete?");
     scanf("%d\n",&n);
    
         for(i=0;i<200;i++){
     t[i]=0;         //ovde postavlja clanove na 0
         }
     max=0;
    
       for(i=0;i<n;i++){                            
           gets(s);                                
           if ((strlen(s)-1)>max) max=strlen(s)-1; //max je najveca duzina stringa,tj.broja koji se unese           
        
         for(j=max;j>=0;j--){
         t[j]=t[j]+s[j];
     if((t[j]>9)&&(j!=0)){
     a=t[j]/10;                   //racuna koliki je prenos
         t[j]=(t[j]%10);                   //racuna cifru 
         t[j-1]=t[j-1]+s[j-1]+a;            //racuna sledeci clan sa prenosom
        }
            } 
        }
    
         for(j=0;j<=max;j++){
         printf("%d",t[j]);
 }    
         printf(" je suma.\n");

return 0;
}

U stvari,sad mi ispise sumu,ali nece dobro..

[Ovu poruku je menjao Mil93 dana 09.07.2013. u 12:19 GMT+1]
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Sabiranje velikih brojeva09.07.2013. u 12:01 - pre 131 meseci
Ne možeš da sabiraš babe i žabe.

U liniji

t[j]=t[j]+s[j]

sabiraš ceo broj (int) sa znakom (char). Znak nula ('0') je kodirana kao 48 u ASCII kodnom rasporedu, tako da dobiješ, na primer: 0+'0' = 0 + 48 = 48, umesto da dobiješ rezultat 0.

Treba da stoji

t[j]=t[j]+s[j]-'0'

Druga stvar, ako treba da sabereš trocifreni broj 100 i četvorocifreni broj na primer 1000, tada treba trocifreni broj da pomeriš za jedno mesto u desno, tj. da dodaš 0 na početak broja 100+1000=0100+1000=1100.
Ono što ti radiš u programu je da sumu napuniš nulama, pa ako je međusuma 100 a treba da dodaš 1000, ti uzmeš još jednu nulu desno pa ti ispadne 100+1000=1000+1000=2000, što naravno nije tačno.

Treće ako sabiraš dva n-cifrena broja tada rezultat može imati n ili n+1 cifru. Treba da predviviš da postoji prekoračenje kod najvažnije pozicije i obradiš taj slučaj.

Kada ispraviš te greške, saberi brojeve
100
1000
9000
i ako dobiješ 10100 kao rezultat, verovatno ti program radi kako treba.

Za one koji hoće više da znaju, treba koristiti fgets umesto gets, ali sa tvojim nivoom znanja, biće dobro i ako isteraš da program sabira kako treba , a za problem prekoračenja opsega stringa možeš da se kasnije pozabaviš.
 
Odgovor na temu

Mil93
Slobodan Milutinovic

Član broj: 301468
Poruke: 26
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Sabiranje velikih brojeva09.07.2013. u 13:13 - pre 131 meseci
Hvala puno na odgovoru!sad cu videti to da ispravim..
U,sad mi se dosta iskomplikovalo..a jel bi mogao na neki drugi nacin lakse da uradim?

[Ovu poruku je menjao Mil93 dana 09.07.2013. u 14:48 GMT+1]
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Sabiranje velikih brojeva09.07.2013. u 14:30 - pre 131 meseci
Može i prostije, upotrebiš gotovu biblioteku koja to radi:

http://gmplib.org/manual/

Code (cpp):

#include <iostream>
#include <gmpxx.h>

int main(){
     mpz_class sum, t;
     
     while(std::cin>>t) sum+= t;
     std::cout << sum << " je suma.\n";

     return 0;
}
 


Code:

$ g++ bignum.cpp -o bignum -lgmpxx -lgmp
$ ./bignum
12345678901234567890
12345678901234567890
24691357802469135780 je suma.

 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Sabiranje velikih brojeva09.07.2013. u 15:30 - pre 131 meseci
Evo i programa koji radi sumiranje "velikih" brojeva na osnovu onoga što si ti napisao:

Code (c):

#include <stdio.h>
#include <string.h>
#define MAXL 200

int main(){
     int t_size=0,s_size,i,j,carry=0;
     char s[MAXL];
     int t[MAXL];
     
     printf("Unesite brojeve koje zelite da saberete.\n");
     printf("Za kraj unesite CTRL+D ili CTRL+Z u zavisnosti od test okruzenja\n");
     
     for(i=0;i<200;i++) t[i]=0;         //ovde postavlja clanove na 0
     
     while(gets(s)){                        
          s_size=strlen(s)-1;
          for(j=0;j<=s_size;j++){
               t[j]=t[j]+s[s_size-j]-'0'+carry;
               carry=t[j]/10;
               t[j]%=10;
          }
          while(carry){
               ++s_size;
               t[s_size]+=carry;
               carry=t[s_size]/10;
               t[s_size]%=10;
          }
        if(s_size>t_size) t_size=s_size;         
          }

     
     for(j=t_size;j>=0;j--){
          printf("%d",t[j]);
     }    
     printf(" je suma.\n");

     return 0;
}
 


edit: primetio i popravio grešku u programu...

[Ovu poruku je menjao djoka_l dana 09.07.2013. u 17:08 GMT+1]
 
Odgovor na temu

Mil93
Slobodan Milutinovic

Član broj: 301468
Poruke: 26
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: Sabiranje velikih brojeva09.07.2013. u 16:10 - pre 131 meseci
Majstorcino,hvala puno!:)))bas mi je to trebalo:)
 
Odgovor na temu

[es] :: C/C++ programiranje :: Sabiranje velikih brojeva

[ Pregleda: 4077 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.