Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
Crni Forumaš(ica)
Pridružen/a: 15. 12. 2003. (01:20:43) Postovi: (23C)16
Spol:
Lokacija: Zagreb
|
Postano: 23:31 sri, 28. 4. 2004 Naslov: Za nadobudnije |
|
|
Pričal' mi je frend kaj inače ne ide u moju grupu za RP1 da su imali za zadatak napisat' neki "ultrateški" program kaj zbraja dva prirodna broja na način kak se to inače radi na papiru (osnovna škola) pomoću pointera. Rekel' mi je da nikom živom u grupi stvar nije šljakala kak' spada. OK, ja si mislim ono, idem probat'. I uspio sam! 8) Dakle vi nadobudniji, uživajte. Crni je sredil' stvar! 8)
[code:1]#include <stdio.h>
#include <malloc.h>
int max (int a, int b)
{
if (a>=b)
return a;
else
return b;
}
int brz (int a)
{
int s,p;
s=0;
if (a==0)
return 1;
else
{
p=a;
while (p!=0)
{
p=p/10;
s++;
}
return s;
}
}
int prvaz (int a)
{
int p;
p=(a/10)*10;
return a-p;
}
int mem (int a)
{
if (a>=10)
return 1;
else
return 0;
}
void glavna (int a, int b)
{
int *p,*q,*r,br,i,g1,g2,t;
br=brz(max(a,b));
p=(int *) malloc((br+2)*sizeof(int));
q=(int *) malloc((br+2)*sizeof(int));
r=(int *) malloc((br+2)*sizeof(int));
g1=a;
g2=b;
for (i=0; i<=br; i++)
{
p[i]=prvaz(g1);
g1=g1/10;
q[i]=prvaz(g2);
g2=g2/10;
}
t=0;
/*----------Pazi sad ovo! Ključni dio!------------------------*/
for (i=0; i<=br; i++)
{
r[i]=prvaz(p[i]+q[i]+t);
t=mem(p[i]+q[i]+t);
}
/*--------------------------------------------------------------*/
for (i=br; i>=0; i--)
printf("%d",p[i]);
printf("\n");
for (i=br; i>=0; i--)
printf("%d",q[i]);
printf("\n");
for (i=br; i>=0; i--)
printf("%d",r[i]);
free(p);
free(q);
free(r);
}
main()
{
int a,b;
scanf("%d",&a);
scanf("%d",&b);
glavna(a,b);
scanf("\n");
}[/code:1]
Pričal' mi je frend kaj inače ne ide u moju grupu za RP1 da su imali za zadatak napisat' neki "ultrateški" program kaj zbraja dva prirodna broja na način kak se to inače radi na papiru (osnovna škola) pomoću pointera. Rekel' mi je da nikom živom u grupi stvar nije šljakala kak' spada. OK, ja si mislim ono, idem probat'. I uspio sam! Dakle vi nadobudniji, uživajte. Crni je sredil' stvar!
Kod: | #include <stdio.h>
#include <malloc.h>
int max (int a, int b)
{
if (a>=b)
return a;
else
return b;
}
int brz (int a)
{
int s,p;
s=0;
if (a==0)
return 1;
else
{
p=a;
while (p!=0)
{
p=p/10;
s++;
}
return s;
}
}
int prvaz (int a)
{
int p;
p=(a/10)*10;
return a-p;
}
int mem (int a)
{
if (a>=10)
return 1;
else
return 0;
}
void glavna (int a, int b)
{
int *p,*q,*r,br,i,g1,g2,t;
br=brz(max(a,b));
p=(int *) malloc((br+2)*sizeof(int));
q=(int *) malloc((br+2)*sizeof(int));
r=(int *) malloc((br+2)*sizeof(int));
g1=a;
g2=b;
for (i=0; i<=br; i++)
{
p[i]=prvaz(g1);
g1=g1/10;
q[i]=prvaz(g2);
g2=g2/10;
}
t=0;
/*----------Pazi sad ovo! Ključni dio!------------------------*/
for (i=0; i<=br; i++)
{
r[i]=prvaz(p[i]+q[i]+t);
t=mem(p[i]+q[i]+t);
}
/*--------------------------------------------------------------*/
for (i=br; i>=0; i--)
printf("%d",p[i]);
printf("\n");
for (i=br; i>=0; i--)
printf("%d",q[i]);
printf("\n");
for (i=br; i>=0; i--)
printf("%d",r[i]);
free(p);
free(q);
free(r);
}
main()
{
int a,b;
scanf("%d",&a);
scanf("%d",&b);
glavna(a,b);
scanf("\n");
} |
|
|
[Vrh] |
|
satan Gost
|
|
[Vrh] |
|
GauSs_ Moderator
Pridružen/a: 28. 01. 2004. (21:01:17) Postovi: (53C)16
Spol:
Lokacija: 231
|
Postano: 12:20 sri, 2. 6. 2004 Naslov: |
|
|
evo vam i jedna implementacija pomocu vezanih lista radjena na
proslogodisnjim vjezbama( proizvoljno veliki prirodni brojevi) :
[code:1]
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct cvor_liste *veza;
struct cvor_liste{
int a;
veza iduci;
};
veza inverzna_lista(veza );
int zbrajanje( veza , veza );
int main(){
veza x, pocetak_liste1, pocetak_liste2, trenutni1, trenutni2;
char tmp;
int help;
puts("Ovaj program prihvaca broj sve dok se ne upise nesto razlicito od znamenke(0-9)");
x=(veza) malloc( sizeof(*x));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 1;
}
printf("\nUnesite pozitivan cijeli broj_1:\n");
tmp=getchar();
if(!isdigit(tmp)){
puts("Bilo bi lijepo kada biste pozitivan cijeli upisali broj");
return 1;
}
x->a=atoi(&(tmp));
x->iduci=NULL;
pocetak_liste1=x;
while(isdigit(tmp)){
tmp=getchar();
if(isdigit(tmp)){
x=(x->iduci=(veza) malloc(sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 1;
}
x->a=atoi(&(tmp));
x->iduci=NULL;
}
}
/*printf("\n%c\n", x->a);*/
x=(veza) malloc( sizeof(*x));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 1;
}
printf("\nUnesite pozitivan cijeli broj_2:\n");
tmp=getchar();
if(!isdigit(tmp)){
puts("Bilo bi lijepo kada biste upisali pozitivan cijeli broj");
return 1;
}
x->a=atoi(&(tmp));
x->iduci=NULL;
pocetak_liste2=x;
while(isdigit(tmp)){
tmp=getchar();
if(isdigit(tmp)){
x=(x->iduci=(veza) malloc(sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 1;
}
x->a=atoi(&(tmp));
x->iduci=NULL;
}
}
/*printf("\n%c\n", x->a);*/
printf("\nZa mnozenje pritisnite 1( nije implementirano), a za zbrajanje 2:\t");
scanf("%d", &help);
switch(help){
case 2:
if(!zbrajanje( inverzna_lista(pocetak_liste1), inverzna_lista(pocetak_liste2))){
puts("Pogreska pri alociranju memorije!!!");
return 1;
}
break;
case 1:
default:
puts("\nMislim stvarno ste bezobrazni!!! Zar ne znate citati???\n");
break;
}
return 0;
}
veza inverzna_lista(veza pocetni){
veza y, t, inverzna;
inverzna=NULL;
y=pocetni;
while(y!=NULL){
t=y->iduci;
y->iduci=inverzna;
inverzna=y;
y=t;
}
return inverzna;
}
int zbrajanje( veza pocetak1, veza pocetak2){
veza trenutni;
veza pocetak3, x, rez1;
int tmp;
x=(veza) malloc( sizeof(*x));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 0;
}
x->a=((pocetak1->a)+(pocetak2->a))%10;
tmp=((pocetak1->a)+(pocetak2->a))/10;
pocetak3=x;
while((pocetak1->iduci)!=NULL && (pocetak2->iduci)!=NULL){
pocetak1=pocetak1->iduci; pocetak2=pocetak2->iduci;
x=(x->iduci=(veza) malloc( sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 0;
}
x->a=((pocetak1->a)+(pocetak2->a)+tmp)%10;
tmp=((pocetak1->a)+(pocetak2->a)+tmp)/10;
}
if((pocetak1->iduci)==NULL){
while((pocetak2->iduci)!=NULL){
pocetak2=pocetak2->iduci;
x=(x->iduci=(veza) malloc( sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 0;
}
x->a=((pocetak2->a)+tmp)%10;
tmp=((pocetak2->a)+tmp)/10;
}
}
if((pocetak2->iduci)==NULL){
while((pocetak1->iduci)!=NULL){
pocetak1=pocetak1->iduci;
x=(x->iduci=(veza) malloc( sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 0;
}
x->a=((pocetak1->a)+tmp)%10;
tmp=((pocetak1->a)+tmp)/10;
}
}
x=(x->iduci=(veza) malloc( sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 0;
}
x->a=tmp;
x->iduci=NULL;
rez1=inverzna_lista(pocetak3);
trenutni=rez1;
printf("\nZbroj je:\t");
while(rez1!=NULL){
printf("%d", rez1->a);
trenutni=rez1;
rez1=rez1->iduci;
free(trenutni);
}
printf("\n");
return 1;
}
[/code:1]
========
8) :lol: 8)
evo vam i jedna implementacija pomocu vezanih lista radjena na
proslogodisnjim vjezbama( proizvoljno veliki prirodni brojevi) :
Kod: |
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct cvor_liste *veza;
struct cvor_liste{
int a;
veza iduci;
};
veza inverzna_lista(veza );
int zbrajanje( veza , veza );
int main(){
veza x, pocetak_liste1, pocetak_liste2, trenutni1, trenutni2;
char tmp;
int help;
puts("Ovaj program prihvaca broj sve dok se ne upise nesto razlicito od znamenke(0-9)");
x=(veza) malloc( sizeof(*x));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 1;
}
printf("\nUnesite pozitivan cijeli broj_1:\n");
tmp=getchar();
if(!isdigit(tmp)){
puts("Bilo bi lijepo kada biste pozitivan cijeli upisali broj");
return 1;
}
x->a=atoi(&(tmp));
x->iduci=NULL;
pocetak_liste1=x;
while(isdigit(tmp)){
tmp=getchar();
if(isdigit(tmp)){
x=(x->iduci=(veza) malloc(sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 1;
}
x->a=atoi(&(tmp));
x->iduci=NULL;
}
}
/*printf("\n%c\n", x->a);*/
x=(veza) malloc( sizeof(*x));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 1;
}
printf("\nUnesite pozitivan cijeli broj_2:\n");
tmp=getchar();
if(!isdigit(tmp)){
puts("Bilo bi lijepo kada biste upisali pozitivan cijeli broj");
return 1;
}
x->a=atoi(&(tmp));
x->iduci=NULL;
pocetak_liste2=x;
while(isdigit(tmp)){
tmp=getchar();
if(isdigit(tmp)){
x=(x->iduci=(veza) malloc(sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 1;
}
x->a=atoi(&(tmp));
x->iduci=NULL;
}
}
/*printf("\n%c\n", x->a);*/
printf("\nZa mnozenje pritisnite 1( nije implementirano), a za zbrajanje 2:\t");
scanf("%d", &help);
switch(help){
case 2:
if(!zbrajanje( inverzna_lista(pocetak_liste1), inverzna_lista(pocetak_liste2))){
puts("Pogreska pri alociranju memorije!!!");
return 1;
}
break;
case 1:
default:
puts("\nMislim stvarno ste bezobrazni!!! Zar ne znate citati???\n");
break;
}
return 0;
}
veza inverzna_lista(veza pocetni){
veza y, t, inverzna;
inverzna=NULL;
y=pocetni;
while(y!=NULL){
t=y->iduci;
y->iduci=inverzna;
inverzna=y;
y=t;
}
return inverzna;
}
int zbrajanje( veza pocetak1, veza pocetak2){
veza trenutni;
veza pocetak3, x, rez1;
int tmp;
x=(veza) malloc( sizeof(*x));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 0;
}
x->a=((pocetak1->a)+(pocetak2->a))%10;
tmp=((pocetak1->a)+(pocetak2->a))/10;
pocetak3=x;
while((pocetak1->iduci)!=NULL && (pocetak2->iduci)!=NULL){
pocetak1=pocetak1->iduci; pocetak2=pocetak2->iduci;
x=(x->iduci=(veza) malloc( sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 0;
}
x->a=((pocetak1->a)+(pocetak2->a)+tmp)%10;
tmp=((pocetak1->a)+(pocetak2->a)+tmp)/10;
}
if((pocetak1->iduci)==NULL){
while((pocetak2->iduci)!=NULL){
pocetak2=pocetak2->iduci;
x=(x->iduci=(veza) malloc( sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 0;
}
x->a=((pocetak2->a)+tmp)%10;
tmp=((pocetak2->a)+tmp)/10;
}
}
if((pocetak2->iduci)==NULL){
while((pocetak1->iduci)!=NULL){
pocetak1=pocetak1->iduci;
x=(x->iduci=(veza) malloc( sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 0;
}
x->a=((pocetak1->a)+tmp)%10;
tmp=((pocetak1->a)+tmp)/10;
}
}
x=(x->iduci=(veza) malloc( sizeof(*x)));
if(x==NULL){
puts("Pogreska pri alociranju memorije!!!");
return 0;
}
x->a=tmp;
x->iduci=NULL;
rez1=inverzna_lista(pocetak3);
trenutni=rez1;
printf("\nZbroj je:\t");
while(rez1!=NULL){
printf("%d", rez1->a);
trenutni=rez1;
rez1=rez1->iduci;
free(trenutni);
}
printf("\n");
return 1;
}
|
========
|
|
[Vrh] |
|
bingo Forumaš(ica)
Pridružen/a: 05. 11. 2002. (18:03:08) Postovi: (31)16
|
Postano: 10:30 sub, 5. 6. 2004 Naslov: |
|
|
Jao Gauss, pa ovo :
[code:1] x->a=((pocetak1->a)+tmp)%10;
tmp=((pocetak1->a)+tmp)/10;
[/code:1]
je grozno sporo! Kod Crnog je bolje:
[code:1]
r[i]=prvaz(p[i]+q[i]+t);
t=mem(p[i]+q[i]+t);
int mem (int a)
{
if (a>=10)
return 1;
else
return 0;
}
[/code:1]
Ali i Crni ima gresku kod ucitavanja "velikih" brojeva:
int a,b; <----- :shock:
scanf("%d",&a);
scanf("%d",&b);
glavna(a,b);
I ako vec uzimate int za znamenku onda je uputno uzeti sto vecu bazu tako da je 2b-1 < maxInt.
Ipak, Gauss je primjetio da se isplati provjeravati duljinu broja, pa nakon sto kracem nestanu znamenke, samo propagirati prijenos. Ali taj prijenos propagiras samo dok su ti u duzem broju znamenke (b-1) a nakon toga samo kopiras znamenke. I da budem sitnicav do kraja, dinamicka alokacije je osjetno sporija od upotrebe polja, pa ako se ima iole kakva predodzba o duzini broja, onda je uputno koristiti fiksno polje.
Jao Gauss, pa ovo :
Kod: | x->a=((pocetak1->a)+tmp)%10;
tmp=((pocetak1->a)+tmp)/10;
|
je grozno sporo! Kod Crnog je bolje:
Kod: |
r[i]=prvaz(p[i]+q[i]+t);
t=mem(p[i]+q[i]+t);
int mem (int a)
{
if (a>=10)
return 1;
else
return 0;
}
|
Ali i Crni ima gresku kod ucitavanja "velikih" brojeva:
int a,b; <-----
scanf("%d",&a);
scanf("%d",&b);
glavna(a,b);
I ako vec uzimate int za znamenku onda je uputno uzeti sto vecu bazu tako da je 2b-1 < maxInt.
Ipak, Gauss je primjetio da se isplati provjeravati duljinu broja, pa nakon sto kracem nestanu znamenke, samo propagirati prijenos. Ali taj prijenos propagiras samo dok su ti u duzem broju znamenke (b-1) a nakon toga samo kopiras znamenke. I da budem sitnicav do kraja, dinamicka alokacije je osjetno sporija od upotrebe polja, pa ako se ima iole kakva predodzba o duzini broja, onda je uputno koristiti fiksno polje.
|
|
[Vrh] |
|
GauSs_ Moderator
Pridružen/a: 28. 01. 2004. (21:01:17) Postovi: (53C)16
Spol:
Lokacija: 231
|
Postano: 13:53 sub, 5. 6. 2004 Naslov: |
|
|
[quote="bingo"]I da budem sitnicav do kraja, dinamicka alokacije je osjetno sporija od upotrebe polja, pa ako se ima iole kakva predodzba o duzini broja, onda je uputno koristiti fiksno polje.[/quote]
zanimljiva sitnicavost! ali kao sto napisah:
[quote="GauSs_"]evo vam i jedna implementacija pomocu vezanih lista radjena na
proslogodisnjim vjezbama( proizvoljno veliki prirodni brojevi) [/quote]
a zadatak je glasio:
[code:1]Napisite program koji realizira zbrajanje i mnozenje proizvoljno velikih pozitivnih cijelih brojeva zapisanih u dekadskom sustavu. Brojeve realizirajte kao vezane liste.[/code:1]
[quote="bingo"]
Jao Gauss, pa ovo :
[code:1] x->a=((pocetak1->a)+tmp)%10;
tmp=((pocetak1->a)+tmp)/10; [/code:1]
je grozno sporo![/quote]
primjedba stoji!
bingo (napisa): | I da budem sitnicav do kraja, dinamicka alokacije je osjetno sporija od upotrebe polja, pa ako se ima iole kakva predodzba o duzini broja, onda je uputno koristiti fiksno polje. |
zanimljiva sitnicavost! ali kao sto napisah:
GauSs_ (napisa): | evo vam i jedna implementacija pomocu vezanih lista radjena na
proslogodisnjim vjezbama( proizvoljno veliki prirodni brojevi) |
a zadatak je glasio:
Kod: | Napisite program koji realizira zbrajanje i mnozenje proizvoljno velikih pozitivnih cijelih brojeva zapisanih u dekadskom sustavu. Brojeve realizirajte kao vezane liste. |
bingo (napisa): |
Jao Gauss, pa ovo :
Kod: | x->a=((pocetak1->a)+tmp)%10;
tmp=((pocetak1->a)+tmp)/10; |
je grozno sporo! |
primjedba stoji!
_________________ The purpose of life is to end
Prosle su godine kolokviji bili laksi, zar ne?
|
|
[Vrh] |
|
|