[C] Wytłumaczenie kawałka kodu.

zdzicho0
Użytkownik
Użytkownik
Posty: 157
Rejestracja: 15 paź 2011, o 22:45
Płeć: Mężczyzna
Lokalizacja: ...
Podziękował: 9 razy

[C] Wytłumaczenie kawałka kodu.

Post autor: zdzicho0 »

Witam.

Prosiłbym o napisanie kilku komentarzy do tego kawalka kodu w C:

Kod: Zaznacz cały

int mnozenie(int num)  
{  
    long int i,r=0;  
    int tab_pom[MAX];  
  
    for(i=0;i<=dlugosc;i++){  
         tab_pom[i]=silnia[i]; 
         silnia[i]=(tab_pom[i]*num + r)%10;  // czemu jest taka skladnia, po co to r i czemu modulo 10
         r=(tab_pom[i]*num + r)/10; // to samo co wyzej 
    }  
    if(r!=0){  
         while(r!=0){  
             silnia[i]=r%10;  // to
             r= r/10;  //  to
             i++;  
         }  
    }  
    dlugosc = i-1;     // i to
}  
wiem wszystko co co oznacza tylko nie bardzo moge zaczaic tego co pozaznaczalem i co sie dzieje w tych miejscach. Potrzebuje to zrozumiec aby napisac program. Prosze o szybka pomoc.
Ostatnio zmieniony 20 gru 2011, o 14:15 przez Afish, łącznie zmieniany 1 raz.
Powód: Brak tagów Code.
wawek91
Użytkownik
Użytkownik
Posty: 795
Rejestracja: 2 cze 2010, o 08:56
Płeć: Mężczyzna
Lokalizacja: Tarnów
Podziękował: 14 razy
Pomógł: 66 razy

[C] Wytłumaczenie kawałka kodu.

Post autor: wawek91 »

No ale to z kawałka kodu to ciężko tak. Co ten program ma robić. Bo pewnie te instrukcje są po to żeby robił coś co ma robić.
zdzicho0
Użytkownik
Użytkownik
Posty: 157
Rejestracja: 15 paź 2011, o 22:45
Płeć: Mężczyzna
Lokalizacja: ...
Podziękował: 9 razy

[C] Wytłumaczenie kawałka kodu.

Post autor: zdzicho0 »

ogolnie to liczy silnie duzych liczb na tablicach. tylko nie rozumiem wlasnie tej czesci programu
Xitami

[C] Wytłumaczenie kawałka kodu.

Post autor: Xitami »

tak może będzie łatwiej?

Kod: Zaznacz cały

unsigned char silnia[159]={1};
int dlugosc = 0;

int mnozenie(int num) {
    long int i, r = 0;
    for (i = 0; i <= dlugosc; i++) {
        r += silnia[i] * num;
        silnia[i] = r % 10;
        r /= 10;
    }
    while (r != 0) {
        silnia[i] = r % 10; 
        r = r / 10; 
        i++;
    }
    dlugosc = i - 1; 
}

main(){
    int i;
    for( i=2; i<=100; i++)
    	mnozenie( i );
    for( i=dlugosc; i>=0; i--)
        printf("%d", silnia[i]);
}
MJBC
zdzicho0
Użytkownik
Użytkownik
Posty: 157
Rejestracja: 15 paź 2011, o 22:45
Płeć: Mężczyzna
Lokalizacja: ...
Podziękował: 9 razy

[C] Wytłumaczenie kawałka kodu.

Post autor: zdzicho0 »

Tak wygląda cały mój kod. Prosilbym o wytłumaczenie tego co zaznaczyłem w pierwszym poście, jeżeli ktos ma chwilkę.

Kod: Zaznacz cały

#include<stdio.h>  
#define MAX 1000  

int dlugosc = 0;  

int silnia[MAX];  
  
int silnia_z(int num)  
{  
    int i;  
    for(i=2;i<=num;i++)  
{  
         mnozenie(i);  
    }  
}  

int mnozenie(int num)  
{  
    long int i,r=0;  
    int tab_pom[MAX];  
  
    for(i=0;i<=dlugosc;i++){  
         tab_pom[i]=silnia[i]; 
         silnia[i]=(tab_pom[i]*num + r)%10;  
         r=(tab_pom[i]*num + r)/10;  
    }  
    if(r!=0){  
         while(r!=0){  
             silnia[i]=r%10;  
             r= r/10;  
             i++;  
         }  
    }  
    dlugosc = i-1;     
}  

int main(){  
    int num;  
    int i;  
  
    printf("Wpisz liczbe: ");  
    scanf("%d",&num);  

    silnia[0]=1;  
    silnia_z(num);  
    
    printf("
Silnia z tej liczby to : ");  
    for(i=dlugosc;i>=0;i--)  
    {  
         printf("%d",silnia[i]);  
    }  
    printf("

");
    system("Pause");
    return 0;  
} 
Xitami

[C] Wytłumaczenie kawałka kodu.

Post autor: Xitami »

ktoś bawił się tym kodem i dodał lokalną tab_pom[]
jest zbędna, popatrz na mój kod powyżej

mnożysz wielocyfrową liczbę (silnia[]) przez coś (num)
przy mnożeniu pojawią się przeniesienia (r) startujące oczywiście od zera
mnożysz kolejną cyfrę długiej liczby przez num i oczywiście dodajesz przeniesienie z poprzednich (r += ...)
modyfikujesz bieżącą cyfrę, wstawiasz tam najmłodszą cyfrę z sumy iloczynu i przeniesienia (silnia = r %10)
przeniesienie do kolejnej to r / 10
zmienna dlugosc to indeks najstarszej cyfry długiej liczby, taka mała optymalizacja by nie mnożyć przez nieznaczące zera
oczywiście iloczyn może być i często jest dłuższy, w przeniesieniu (r) może coś zostać po dotarciu do najstarszej cyfry i dla tego jest pętla while()

jeżeli masz jeszcze jakieś pytania to proszę odnieś się do mojego kodu.-- 19 grudnia 2011, 22:02 --dość łatwo przyśpieszyć jakieś 9 razy
zdzicho0
Użytkownik
Użytkownik
Posty: 157
Rejestracja: 15 paź 2011, o 22:45
Płeć: Mężczyzna
Lokalizacja: ...
Podziękował: 9 razy

[C] Wytłumaczenie kawałka kodu.

Post autor: zdzicho0 »

Acha i dlaczego czy to w moim czy twoim kodzie jest %10 i /10 . Co nam daje ta 10 i dlaczego akurat jest 10 ? Pytanie pewnie głupie

i ta dlugosc=i-1 co to jest ?
Xitami

[C] Wytłumaczenie kawałka kodu.

Post autor: Xitami »

liczba składa się z cyfr
w tablicy zapamiętujemy pojedyncze cyfry długiej liczby
tak jakbyś mnożył na papierze w kratkę, jedna kratka - jedna cyfra
ale mnożyć możesz przez dowolną liczbę (num)
i z tego iloczynu (+przeniesienie) trzeba wyłuskać najmłodszą cyfrę, do tego mamy %
odrzucamy najmłodszą więc r /= 10

wymnożyliśmy wszystkie cyfry ale zostało nam przeniesieni i może być wielocyfrowe, koljne cyfry trzeba poutykać w naszej superliczbie i odpowiednio zmodyfikować pomocniczą zmienną długośc
ODPOWIEDZ