Функция возвращает неверное значение

243
27 декабря 2017, 21:15
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int GetLength(int n);
int GetSum(int n);
int main()
{
    vector<int> d;
    int number;
    int best = 2;
    int lengthC = 1;
    cin >> number;
    while (number % best != 0) best++;
    while (number >= best)
    {
        int temp = 0;
        if ((find(d.begin(), d.end(), best) == d.end()) && number % best == 0) 
        {
        d.push_back(best);
        temp = best;
        best++;
    }
    else
    {
        while (number % best != 0 && best != temp) best++;
    }
}
best = d[0];
for (int j = 1; j < d.size(); j++)
{
    int fD = GetSum(d[j]) - GetLength(d[j]);
    int fB = GetSum(best) - GetLength(best);
    if (fD <= fB)
    {
        best = d[j];
    }
}
cout << best;
return 0;
}
int GetLength(int n)
{
    int counter = 0;
    while (n != 0)
    {
        n /= 10;
        counter++;
    }
    return counter;
}
int GetSum(int n)
{
    switch(GetLength(n)
    {
        case '1': 
            return n;
            break;
        case '2': 
            return (n % 10 + n / 10);
            break;
        case '3':
            return (n / 100 + n / 10 % 10 + n % 100 % 10);
            break;
        case '4': 
            return ((n / 1000) + (n / 100 % 10) + (n / 10 % 100 % 10) + (n % 10));
            break;
        case '5': 
            return ((n / 10000) + (n / 1000 % 10) + (n / 100 % 100 % 10) + (n % 100 / 10) + (n % 10));
            break;
    }
}

Почему на строке 31(int fD =...) всегда возвращается значение -49 независимо от значения?

Answer 1

Вы в caseах-то сравнивайте с числами, а не с символами. Ну не равно 1 и '1'...

И вообще - вас компилятор должен был предупредить, что вы в GetSum можете вылететь без конкретного возвращаемого значения. Почему проигнорировали?!

И, да, я не смотрел внимательно ваш switch, но кажется мне, что что-то там наверчено лишнего. Это же сумма цифр? ну так

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

Или вам обязательно через switch? А если число шестизначное? :)

Answer 2

я не тестировал ваш код, но наверное компилятор не понимая что вы написали в GetSum, в точке вызова GetSum возврашает вам символ '1', неявно преобразовав его в int, и поскольку int('1') == 49, то ваш результат будет таким в любом случае

READ ALSO
Как находить библиотеки с помощью CMake?

Как находить библиотеки с помощью CMake?

У меня в проекте используются библиотеки Boost и WebRTCПри попытке собрать проект возникает проблема со сборкой WebRTC вот скриншот

290
Реализация функций empty и clear для вектора

Реализация функций empty и clear для вектора

Правильно я сделала функции?

226
Кракозябры сообщений компилятора в QtCreator

Кракозябры сообщений компилятора в QtCreator

При использовании компилятора Microsoft в Qt-проекте в окне сборки выводятся сообщения об ошибках и предупреждениях с поломанной кодировкойНапример:

280