Wątek przeniesiony 2018-11-14 15:19 z C/C++ przez furious programming.

Program sumujący n początkowych liczb – nie wiem gdzie dać inkrementację

2018-11-14 16:17
0

Napisz program wyznaczający sumę n początkowych liczb, których suma cyfr jest liczbą parzystą (n zależy od użytkownika)

Mam już większość, ale nie wiem jak wykończyć. nie wiem gdzie dać inkrementację "i", żeby sprawdzało kolejne liczby. Z góry dziękuję.

#include<stdio.h>

void main()
{
  printf("Program wyznacza sumę n początkowych liczb, których suma cyfr jest liczbą parzystą.\n");
  int n, suma=0, liczba=0, suma2=0;
  printf("Podaj n: ");
  scanf("%d", &n);
  for(int j=0; j<n; j++)
    for(int i=11, k=i; i>0;)
      {
       liczba=k%10;
       suma+=liczba;
       k=k/10;
       if(suma%2==0)
     {
     suma2+=k;
     i=k;
     }
      }
  printf("suma=%d\n", suma2 );
}
edytowany 2x, ostatnio: furious programming, 2018-11-14 16:18

Pozostało 580 znaków

2018-11-14 16:26
0

Nie rozumiem po co tu cos dzielic, przypisywac i do k potem przypiywac zmodyfikowane k do i...

int getSumOfParityNumbers(int maxNumber) {
        int sum = 0;
        for (int i=0; i<=maxNumber; i++) {  
            if (i%2 == 0) {
                sum += i;
            }
        }

        return sum;
    }
edytowany 2x, ostatnio: furious programming, 2018-11-14 16:46
2018-11-14 17:02
0

Wiem, że trochę pomieszałem. Ale w poleceniu, nie chodzi o to, żeby dodać kolejne liczby parzyste, tylko te których suma cyfr jest parzysta, czyli np.: 11, 13, 19, 20

Pozostało 580 znaków

2018-11-14 17:56
0

Lepiej logikę na funkcje podzielić:

int sum_digits(int n){
    int sum = 0;
    while (n != 0) {
    sum += n % 10;
    n /= 10;
    }
    return sum;
}

int sum_even(int n){
    int sum = 0;
    while (n){
        if (sum_digits(n) % 2 == 0){
            sum += n;
            n--;
            }
        n--;
    }
    return sum;
}
printf("sum even %d\n", sum_even(6)); // -> 12
printf("sum even %d\n", sum_even(10)); // -> 20

coś za dużo tych n--. - MarekR22 2018-11-14 18:18
W zupełności wystarczy, żeby zdekrementować n raz na obieg pętli:) - lion137 2018-11-14 18:24

Pozostało 580 znaków

2018-11-14 18:21
0

IMO treść zadania mówi, że n reprezentuje liczbę elementów sumy, a nie wartość maksymalną elementu dodawanego do sumy, więc powyższe rozwiązanie nie są prawidłowe.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2018-11-14 18:21

Pozostało 580 znaków

2018-11-14 18:23
1

Wydaje mi się, że można to rozwiązać bez pętli, patrząc na ciąg:

0, 2, 4, 6, 8, 11, 13, 15, 17, 19, 20, 22, …

Widzę pewną zależność. A i długość ciągu znaków można określić na podstawie tych danych.

Pozostało 580 znaków

2018-11-14 18:30
0

Dziękuję bardzo za wszelką pomoc :D

Pozostało 580 znaków

2018-11-14 18:38
0

"IMO treść zadania mówi, że n reprezentuje liczbę elementów sumy, a nie wartość maksymalną elementu dodawanego do sumy, więc powyższe rozwiązanie nie są prawidłowe." No tak, nie doczytałem, wystarczy troszkę zmienić, licznik jakiś dodać:

int sum_digits(int n){
    int sum = 0;
    while (n != 0) {
    sum += n % 10;
    n /= 10;
    }
    return sum;
}

int sum_even(int n){
    int cnt = 0;
    int sum = 0;
    int k = 0;
    while (cnt <= n){
        if (sum_digits(k) % 2 == 0){
            sum += k;
            cnt++;
            k++;
            continue;
            }
        k++;
    }
    return sum;
}
printf("%d, %d, %d\n", sum_even(6), sum_even(7), sum_even(13)); // -> 44, 59, 187

EDIT: Dodane testy.


edytowany 2x, ostatnio: lion137, 2018-11-15 20:58
@lion137 Wydaje mi się, że program ma błąd, taki sam jak poprzednio, przeskakujesz z k o 2, gdy suma cyfr jest parzysta, więc gdy k=19 to następne k będzie 21, a przecież k=20 też spełnia warunek, podobnie z 39, 40, 59, 60 i tak dalej. - cs 2018-11-15 19:22
A widzisz, dzieki, dodalem continue. Teraz powinno byc dobrze, za chwilke to przetestuje. - lion137 2018-11-15 19:35
Przetestowałem, wygląda, że jest OK. - lion137 2018-11-15 20:58

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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