Самый быстрый способ сложить 3 цифры - PullRequest
2 голосов
/ 01 мая 2020

Мой учитель попросил меня решить эту проблему: «В качестве входных данных вы получаете 3 разных числа разной длины, вам нужно определить сумму цифр всех 3 чисел, а также произведение». это:

#include <bits/stdc++.h>

using namespace std;

int main () {
    int a, b, c, S, P;
    cin >> a >> b >> c;
    S = 0;
    P = 1;

    while (a != 0) {
        int c1 = a % 10;
        S += c1;
        P *= c1;
        a /= 10;
    }
    while (b != 0) {
        int c1 = b % 10;
        S += c1;
        P *= c1;
        b /= 10;
    }
    while (c != 0) {
        int c1 = c % 10;
        S += c1;
        P *= c1;
        c /= 10;
    }
    cout << S << ' ' << P << endl;
}

Мой вопрос, есть ли способ решить эту проблему более эффективно?

Ответы [ 2 ]

4 голосов
/ 01 мая 2020

Вам следует беспокоиться не о самом быстром способе, который не имеет смысла для такой простой программы, а о правильности кода и избежании его дублирования.

Ваша программа просто неверна.

Для начала пользователь может прервать ввод. В этом случае хотя бы одна из переменных a, b, c будет иметь неопределенное значение. В результате программа будет иметь неопределенное поведение.

Во-вторых, поскольку вы используете тип int со знаком, когда пользователь может вводить отрицательные числа. В этом случае вы получите неправильный результат, потому что, например, сумма цифр может оказаться отрицательной.

В-третьих, пользователь может ввести 0 в качестве значения числа. В этом случае это число будет пропущено через некоторое время l oop, как это

while (a != 0) {

В этом случае вы снова получите неправильный результат, потому что произведение цифр может быть не равно нулю, хотя должно быть равным нулю в этом случае.

То же самое, пока циклы дублируются. То есть программа имеет избыточный код.

Программа может быть написана следующим образом, как показано в демонстрационной программе ниже.

#include <iostream>

int main() 
{
    long long int a = 0, b = 0, c = 0;

    std::cin >> a >>b >> c;

    long long int sum = 0;
    long long int product = 1;

    for ( int num : { a, b, c } )
    {
        const long long int Base = 10;
        do
        {
            long long int digit = num % Base;

            if ( digit < 0 ) digit = -digit;

            sum += digit;
            if ( product ) product *= digit;
        } while ( num /= Base );
    }

    std::cout << "sum = " << sum << '\n';
    std::cout << "product = " << product << '\n';

    return 0;
}  
0 голосов
/ 01 мая 2020

Переместить повторяющийся код в отдельную функцию.

#include <iostream>
using namespace std;

void calc(int num, int &sum, int &product) {
    do {
        int c1 = num % 10;
        sum += c1;
        product *= c1;
        num /= 10;
    }
    while (num != 0);
} 

int main () {
    int a, b, c, S = 0, P = 1;
    if (cin >> a >> b >> c) {
        calc(a, S, P);
        calc(b, S, P);
        calc(c, S, P);
        cout << S << ' ' << P << endl;
    }
    return 0;
}
...