|
[ Mil93 @ 08.07.2013. 19:58 ] @
| 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:)))
|
[ Nedeljko @ 08.07.2013. 23:25 ] @
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;
}
[ Mil93 @ 09.07.2013. 11:04 ] @
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]
[ djoka_l @ 09.07.2013. 12:01 ] @
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š.
[ Mil93 @ 09.07.2013. 13:13 ] @
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]
[ djoka_l @ 09.07.2013. 14:30 ] @
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.
$
[ djoka_l @ 09.07.2013. 15:30 ] @
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]
[ Mil93 @ 09.07.2013. 16:10 ] @
Majstorcino,hvala puno!:)))bas mi je to trebalo:)
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|