[C] Prosty kalkulator sumowania liczb

Odpowiedz Nowy wątek
2017-11-28 23:51
0

Witam,dopiero zaczynam przygodę z programowaniem i nie wiem jak ugryźć problem dodawania liczb do momentu uzyskania tylko jednej cyfry w systemie dziesietnym

przyklad>

mam cyfrę 6841 chciałbym aby program wyświetlił mi sume 6+8+4+1 = 19 1+9=10 1+0=1
Czy do tego potrzebuje wykorzystać tablicę? Proszę o pomoc

edytowany 1x, ostatnio: rolnikhzg, 2017-11-28 23:52

Pozostało 580 znaków

2017-11-28 23:58
0

6841 to nie jest cyfra.
To liczba.
Nie, nie potrzebujesz do tego tablicy.

#include <stdio.h>

int main(void) {
    char c;
    int sum = 0;

    for (int i = 0; scanf("%c", &c) == 1; ++i) {
        if (i) {
            printf("+");
        }
        printf("%c", c);
        sum += c - '0';
    }
    printf("=%d", sum);
    return 0;
}

https://ideone.com/zcGUGS

input: 6841
output: 6+8+4+1=19

edytowany 2x, ostatnio: spartanPAGE, 2017-11-29 00:02

Pozostało 580 znaków

2017-11-29 00:41
0

Kod, komentarze objaśniają:

#include <stdio.h>

/* Potęgowanie w integerach: https://en.wikipedia.org/wiki/Exponentiation_by_squaring*/
unsigned long pow(unsigned long a, unsigned long b) {
    if (b == 0) return 1;
    if (b == 1) return a;
    if (b % 2 == 0) return pow(a * a, b / 2);
    else return a * pow(a * a, (b - 1) / 2);
    }

/* Suma cyfr w liczbie, prosta obserwacja: kolejne cyfry liczby n to (od prawej):
 * n % 10 
 * n / 10 % 10
 * n / 100 % 10 
 * .....
 */ 
unsigned long sum_digits(unsigned long n){
    unsigned long s = 0;
    for (unsigned long i = 0; n / pow(10, i) > 0; ++i)
        s += (n / pow(10, i)) % 10;
    return s; 
    }

/* Proste, rekurencyjne wywoływanie sumy cyfr, aż do 
 * przypadku bazowego: liczba jednocyfrowej, 
 * wtedy n / 10 == 0
 * */
unsigned long sum_digits_until_one(unsigned long n) {
    if (n / 10 == 0) return n;
    else 
        return sum_digits_until_one(sum_digits(n));
    }

int main(int argc, char **argv)
{
    printf("%d \n", sum_digits_until_one(98792) == 8); // -> 1 (true)
    printf("%d \n", sum_digits_until_one(6841) == 1); // -> 1 (true)
    printf("%d \n", sum_digits_until_one(7777) == 1); // -> 1 (true)
    printf("%d \n", sum_digits_until_one(12345678) == 9); // -> 1 (true)
    printf("%d \n", sum_digits_until_one(90009093) == 3); // -> 1 (true)
    printf("%d \n", sum_digits_until_one(21111111111) == 3); // -> 1 (true)
    return 0;
}

EDIT: Dodane więcej testów i zmieniony format drukowania integera (w testach).
EDIT1 zmiana w funkcji sum_digits_until_one z if (n / 10 == 0) return;, na if (n / 10 == 0) return n;. Podziekowania za walkę ze złymi duchami idą do @spartanPAGE :)


edytowany 3x, ostatnio: lion137, 2017-11-29 13:03
Pokaż pozostałe 2 komentarze
Jak nie działa, jak działa, dodałem testów i zmieniłem format w printf, żeby nie było ostrzeżeń; kompilowane gcc, wersja 5 coś tam. - lion137 2017-11-29 12:41
https://ideone.com/FlM7sN 0 0 0 0 0 0 ;) + kompletnie nie rozumiem co wspólnego twoje wyniki mają z sumowaniem cyfr w liczbie - spartanPAGE 2017-11-29 12:43
Widze, że ideone failuje, ale u mnie działa, tam coś musi być nie tak z formatem, albo typami, Popatrz na to: https://ideone.com/z37FWH , drukuje cały czas zera, coś jest nie tak. - lion137 2017-11-29 12:50
na pewno nie chciałeś dać return n? ;P https://ideone.com/vNJwPE - spartanPAGE 2017-11-29 12:51
LOLLL! Rzeczywiście, tu są jakieś mega chochliki! Nie piszę już nic dzisiaj:-D - lion137 2017-11-29 13:00

Pozostało 580 znaków

2017-11-30 22:40
0

Dziękuje panowie, jeszcze to nie działa do końca ale bliżej niż dalej jestem :)
Podziwiam, że o takich godzinach zechcieliście pomoc! Pozdrawiam sredecznie

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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