Suma cyfr liczby

0

Mam takie zadanie - mianowicie należy napisać program wypisujący liczby:

  • o sumie cyfr równej sumie cyfr liczby n jak najmniej różniącą się od n (jeśli są dwie takie liczby, wypisać należy obie),
  • największą liczbę mniejszą od n o sumie cyfr o 1 mniejszej niż n,
  • najmniejszą liczbę większą od n o sumie cyfr o 1 większej niż n.

Na razie udało mi się napisać tylko coś takiego

#include <bits/stdc++.h>

using namespace std;

int main()
{
  int wynik = 0;
  int liczba;
  cin >> liczba;
  
  
  while (0<liczba)
  {
      wynik+=liczba%10;
      liczba/=10;
  }
  cout << wynik;
}

Byłby ktoś w stanie pomóc?

2
cout<<n+1;

Wypisujący liczby czy cyfry? Nie zadeklarowaleś n. Nie podałeś typu n (rozmiaru). Nie podałeś przykładowego rozwiązania.

0
johnny_Be_good napisał(a):
cout<<n+1;

Wypisujący liczby czy cyfry? Nie zadeklarowaleś n. Nie podałeś typu n (rozmiaru). Nie podałeś przykładowego rozwiązania.

Liczby, n jest typu int.
Przykładowe rozwiązania:
dla n = 15 są to liczby 6 24 14 16, zaś dla n=29 38 28 39.

0
#include <stdio.h>
int sumacyfr (unsigned int liczba)
{       int suma = 0;
        while (liczba)
        {       suma += liczba % 10;
                liczba /= 10;
        }
        return suma;
}
int main ()
{       int liczba;
        printf ("Liczba? ");
        scanf ("%u", &liczba);
        printf ("Suma jej cyfr to %u.\n", sumacyfr (liczba));
        return 0;
}

Program jest sprawdzony i działa.

4
Manna5 napisał(a):

Program jest sprawdzony i działa.

$ ./suma
Liczba? 5000000000
Suma jej cyfr to 28.
$ ./suma
Liczba? 1.234
Suma jej cyfr to 1.
$ ./suma
Liczba? -2
Suma jej cyfr to 56.
$ ./suma
Liczba? 1 200 300
Suma jej cyfr to 1.
$
0
madmaks21 napisał(a):

Byłby ktoś w stanie pomóc?

Zadanie jest trudniejszeprostsze niż się wydaje.
Tutaj napisałem testy do tego zadania (jako forma pomocy), napisz kod, który przejdzie pozytywnie przez te testy.
Uzupełnij sobie też dane testowe.

Dopisałem dosłownie po 6 linijek kodu do każdej z tych funkcji i zadziałało (naiwna implementacja).

0

@Alley Cat: Jeśli chodzi o tego typu przypadki:

#include <stdio.h>
int main ()
{       char cyfra;
        int suma = 0;
        printf ("Liczba? ");
        do {    cyfra = getchar();
                if (cyfra >= '0' && cyfra <= '9')
                        suma += cyfra - 48;
        }       while (cyfra != '\n' && cyfra != EOF);
        printf ("Suma jej cyfr to %u.\n", suma);
        return 0;
}
0
$ ./suma2
Liczba? 4pr06r4mm3rz!
Suma jej cyfr to 17.
$
0

@Alley Cat: Co proponujesz? Żeby wykrywać, że to nie liczba tylko leet-text? Twoja następna próba to będzie wpisanie liczby słownie?

0
Manna5 napisał(a):

@Alley Cat: Co proponujesz? Żeby wykrywać, że to nie liczba tylko leet-text?

O walidacji danych wejściowych kolega nie słyszał? XD

Edit: oraz o testach:


Twoja następna próba to będzie wpisanie liczby słownie?

Dobry pomysł, o tym nie pomyślałem :P
Można byłoby pójść jeszcze dalej i np. wpisać liczbę słownie po chińsku ;)

2
 
int get_size(char tmp[],int rozmiar)
    {    int out=0;  for(int i=0;i<rozmiar;i++)   {
            if(tmp[i]>=49 && tmp[i]<=56) {tablica_tmp_3[out]=tmp[i]; out++;}};return out;}

Ja to zawsze noszę w torebce obok zdjęcia żony prezydenta.

0

Czy ktoś oprócz @MarekR22 udzielający się w wątku przeczytał post OPa? xD

1)Liczba najbliższa n której suma cyfr jest równa sumie cyfr n
Najprościej bedzie iść w dwie strony zaczynajac od n i sprawdzać czy liczby spełniają warunek
dla n = 17:
8<-...<-16<-17->18->...->26
Pierwsza napotkana liczba(liczby) spełniająca warunek jest odpowiedzią. Uważaj żeby nie schodzić poniżej 0.

2)największą liczbę mniejszą od n o sumie cyfr o 1 mniejszej niż n
zaczynajac od n schodzisz i sprawdzasz warunek
dla n = 100
100->99->98->...->0

3)najmniejszą liczbę większą od n o sumie cyfr o 1 większej niż n.
zaczynasz od n i inkrementujesz dopoki warunek nie jest spelniony
dla n = 999
999->1000->...->1018

Jeżeli n < 10^8 to taka odpowiedź powinna wystarczyć.

0
Manna5 napisał(a):

wpisać liczbę słownie po chińsku

I obsługiwać 100 rodzajów kodowania znaków?

A może wystarczy UTF-8? Ewentualnie nawet ASCII (w końcu to tylko liczby)?

Nie chodzi o to, aby obsłużyć liczby w każdym możliwym formacie, tylko żeby program zachował się sensownie w przypadku niepoprawnych danych.

A potem wpadniesz na pomysł wypowiedzenia liczby do mikrofonu?

Widzę, że kolega mocno zbulwersowany koniecznością walidacji danych wejściowych XD

0

Może już skończmy tę dyskusję, bo to już odchodzi od tematu, a jako zadanie powinno wystarczyć przeczytanie liczby dziesiętnej w ASCII ze standardowego wejścia.

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