[ totmast @ 16.09.2011. 19:21 ] @
Treba mi pomoć oko zadatka: Ako bi se na prvo polje šahovske table stavilo jedno zrno, a na svako sljedeće polje dvostruko više nego na prethodno, izračunati koliko bi se zrna nalazilo na posljednjem (64-om) polju, odnosno koliko bi ukupno zrna trebalo da bude na tabli. predpostavljam da se broj posmatra kao niz cifara!!! ali ne znam kako to da izvedem...

Code:

#include <stdio.h>
#include <stdlib.h>
#define MAXCIF 1000
main(){
long s;
int niz[MAXCIF],i;
niz[0]=1;
for(i=1; i<63; i++)
niz[i]=2*niz[i-1];
for (i=0; i<63; i++)
s+=niz[i];
system ("pause");}

Sad kako bih ispisao s
[ X Files @ 16.09.2011. 19:55 ] @
Postoji više načina kako se može baratati velikim brojevima. Jedan od uobičajenih je koristiti biblioteku posebno napravljenu za to i ne razmišljati o limitima. Ipak, pošto se radi o školskom zadatku (koji ima didaktičke ciljeve) i C jeziku, verujem da je profesor na umu imao da se u nizu karaktera "simulira" sabiranje dva ista broja, baš kao u školi ("osam plus osam je šesnaest, pišem šest, pamtim jedan").

Drugim rečima, dovoljno je da imaš jedan niz karaktera odgovarajuće dužine i funkciju koja će u svakoj iteraciji (63) promeniti taj niz za "duplo". Recimo, napraviš niz napunjen nulama, sem poslednjeg elementa "00000000000000000001". Zatim krećeš s obradom niza unazad, od poslednjeg ka prvom elementu. Sabiraš cifru po cifru, pamtiš "višak" za sledeće sabiranje, dodaješ. Ovde ćeš se suočiti s time da je svaka cifra zapisana kao karakter zapravo uvećana za 48, tj za offset s vrednošću '0'.

Naravno, postoje i inteligentnija rešenja, ovo je samo ideja.



Inače broj koji tražiš je (ako se ne varam): 2^64-1, tj 18446744073709551615.



[Ovu poruku je menjao X Files dana 16.09.2011. u 21:07 GMT+1]
[ Picsel @ 16.09.2011. 21:39 ] @
Moglo bi i bez velikih brojeva jer taj broj staje u unsigned long long.
Stavi da su s i niz tog tipa, a za ispis koristi
Code:
printf("%llu", s);


Ako to ne radi (verovatno nece ako koristis Dev-C++ okruzenje), onda
Code:
printf("%I64u", s);


Takodje, fali ti jedna iteracija u petlji, trebas da ides do 63 (uslov ti je <63).
[ mp95 @ 03.01.2016. 12:05 ] @
Ja sam pomoću nizova riješila zadatak na ovaj način:
Code:
#include <stdio.h>
#include <stdlib.h>

int main()
{int i,niz[100]={1},niz2[100]={0},pom,pom2,prenos2,j,k,n=63,prenos=0;
for(k=0;k<n;k++)
for(i=0;i<100;i++)
   {pom=niz[i]*2+prenos;
niz[i]=pom%10;
prenos=pom/10;}
printf("Na zadnjem polju bi se nalazilo:");
for(i=99;niz[i]==0;i--);
for(i;i>=0;i--)
printf("%d",niz[i]);
printf("zrna.");
while(n>=0)
    {for(prenos2=0,i=0;i<100;i++)
    {pom2=niz[i]+niz2[i]+prenos2;
    niz2[i]=pom2%10;
    prenos2=pom2/10;
}
n--;
niz[0]=1;
for(i=1;i<n;i++)
    niz[i]=0;
    for(k=0,prenos=0;k<n;k++)
for(i=0;i<100;i++)
   {pom=niz[i]*2+prenos;
niz[i]=pom%10;
prenos=pom/10;}}
printf("\nNa tabli ukupno ima:");
for(i=99;niz2[i]==0;i--);
for(i;i>=0;i--)
printf("%d",niz2[i]);
printf("zrna.");
    return 0;
}


Lako se može provjeriti tačnost (umjesto n=63, može se staviti neki drugi broj polja)

[Ovu poruku je menjao Mihajlo Cvetanović dana 03.01.2016. u 14:39 GMT+1]