Ilość cyfr w liczbie i ich suma

2012-05-03 16:30
0

Witam
Mam do zrobienia program, który ma obliczyć ilość cyfr w liczbie i ich sumę. Z pierwszą częścią sobie poradzilem, ale druga coś nie chce działać. Zrobiłem coś takiego i nie wiem gdzie jest błąd. Pomożecie?

#include <stdio.h>
#include <math.h>
main()
{
int i,x,z;
//czesc obliczajaca ilosc cyfr
scanf("%d",&i);
x=i;
i=log10(i)+1;
printf("%d\n",i);

//obliczanie sumy - tu mam problem
z=x/(pow(10,i-1));
i=i--;
while(i>=1)
{
          x=x-pow(10,i);
          z=z+(x/pow(10,i-1));
          i--;
          }
printf("%d",z);

system("pause");
return 0;
}
edytowany 1x, ostatnio: kromka92, 2012-05-03 16:31

Pozostało 580 znaków

2012-05-03 16:37
0

Aby obliczyć ilość cyfr musisz dzielić liczbę przez 10 i inkrementować licznik, jeśli wynik z dzielenia jest większy od 0; Jeśli jest mniejszy - inkrementować licznik i wyjść z pętli;

Aby obliczyć sumę wystarczy odczytywać kolejne modulo z dzielenia przez 10 i dodawać je do sumy; Pomyśl nad tym;


edytowany 1x, ostatnio: furious programming, 2012-05-03 16:37
Aby obliczyć ilość cyfr wystarczy zaokrąglić w dół wynik z "log10(x)+1"; po co od razu dzielić? - Patryk27 2012-05-03 16:38
Bo jest prostrze do zrozumienia, a jak widać autor nie bardzo rozumie co robi; - furious programming 2012-05-03 16:41
dzięki @Patryk27 -- przyda się ta wskazówka - jackweb 2012-05-03 20:12

Pozostało 580 znaków

2012-05-03 16:58
ZiomZiom
0
int suma = 0;
int ilosc_cyfr = 0;
int liczba = 4321;
int x = 0;
while( x= liczba % 10){// x jest ostania czescia liczby np 4321 % 10 = 1
suma += x;
ilosc_cyfr++;
liczba = liczba / 10; dzielimy calkowicie przez 10 co z 4321 zostanie nam 432
}
//thats all baby
zagadka: liczba = 1100, jaki wynik da Twój program? - krwq 2012-05-04 20:34
Nasz forumowy "ziomek" po raz drugi palnął głupotę :P - furious programming 2012-05-05 20:19

Pozostało 580 znaków

2012-05-04 19:57
0

a może zamienić liczbę na string, jego długość to ilość cyfr (otwarta kwestia przecinka w liczbach rzeczywistych)
biorąc kolejne elementy stringa, zamieniasz na liczbę i sumujesz. Będzie chyba szybsze (nie ma dzielenia)

to się (pośrednio) sprowadza do dzielenia w pętli przez 10. - Azarien 2012-05-05 21:48

Pozostało 580 znaków

2012-05-05 20:22
0
zefir napisał(a)

a może zamienić liczbę na string

A może...? Przecież to w jaki sposób wykonasz ten algorytm tylko i wyłącznie zależy od Ciebie; Jeśli przeraża Cię matematyka to zamień tę liczbę na łańcuch - będzie Ci łatwiej odczytać ilość cyfr i wykonać resztę obliczeń;

Jeśli interesuje Cię takie rozwiązanie - zrób to; Jeśli musisz wykonać to opierając program jedynie na obliczeniach - przysiądź trochę nad tym; Tak jak wspomniał serdeczny kolega @Wibowit - nie wszystko da się rozwiązać od razu, trzeba się czasem przespać z problemem; To samo polecam Tobie - zastanów się nad tym nie siedząc przy komputerze, jeśli nie jesteś pewien swoich obliczeń to rozrysuj sobie taki algorytm i przeleć na mniejszej liczbie obliczając na papierze wszystko; Napisz najpierw algorytm w pseudojęzyku i prześledź go pod względem poprawności; Później wystarczy jedynie napisać to w C i przetestować;

zefir napisał(a)

Będzie chyba szybsze (nie ma dzielenia)

No tego bym nie powiedział, ale dla tych liczb, które chcesz przetestować większej różnicy nie będzie (nagim okiem nie do zauważenia) chyba, że napaprzesz tam niezłe bzdety :P

Najpierw zrób taki żeby działał, a później go zoptymalizuj; Na razie nie masz nic, więc nie ma się nad czym bardziej zastanawiać;


edytowany 1x, ostatnio: furious programming, 2012-05-05 20:24
"No tego bym nie powiedział, ale dla tych liczb, które chcesz przetestować większej różnicy nie będzie (nagim okiem nie do zauważenia)" - sorki, to takie zboczenie zawodowe, jak coś można optymalnie zrobić, to nawet na kilku liczbach warto ;) w tym przypadku oczywiście nie ma to żadnego znaczenia - zefir 2012-05-07 15:24
Dopóki nie przetestujesz obu rozwiązań to nie dowiesz się które szybsze; Kurde, myślałem, że to Ty @zefir napisałeś ten wątek... Pisałem tak, jak to Ty pytałbyś się :P - furious programming 2012-05-07 16:08

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0