[C] Prosty kalkulator sumowania liczb

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

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

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 :)

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

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