Я только недавно начал заниматься кодированием и столкнулся с проблемой, которую не мог решить в течение нескольких дней, и самое близкое, что мне удалось найти в Интернете, - это программа, проверяющая, содержит ли число конкретная цифра, но я не думаю, что это действительно применимо в моем случае. Проблема заключается в том, чтобы позволить пользователю ввести два положительных числа и проверить, содержится ли обратное второго числа в первом. Например, если вы введете 654321 и 345, будет сказано, что он содержит его, потому что обратное число 345 - 543, а 654321 содержит это. Вот то, что я пытался, но это была катастрофа.

P.S: Переменные должны оставаться целыми на протяжении всей программы.

#include <iostream>
using namespace std;
bool check(int longer, int shorter)
{
    int i = 1;
    int rev=0;
    int digit;
    while (shorter > 0)
    {
        digit = shorter%10;
        rev = rev*10 + digit;
        shorter = shorter/10;
    }
    cout << rev << endl;
    bool win=0;
    int left = longer / 10;             //54321
    int right = longer % 10;            // 65432
    int middle = (longer /10)%10;       // 5432
    int middle1;
    int middle2;
    int trueorfalse = 0;
    while (left > 0 && right > 0 && middle1 > 0 && middle2 >0)
    {
        left = longer / 10;        //4321   //321
        right = longer % 10;       //6543   //654
        middle1 = middle%10;        //543
        middle2= middle/10;         //432
        if (rev == left || rev == right || rev == middle1 || rev == middle2 || rev == middle)
        {
            win = true;
        }
        else
        {
            win = false;
        }
    }
    return win;
}


int main ()
{
    int longer;
    int shorter;
    int winorno;
    cout << "Please enter two numbers, first of which is longer: ";
    cin >> longer;
    cin >> shorter;
    winorno = check(longer,shorter);
    if (winorno==true)
    {
        cout << "It works.";
    }
    else
    {
        cout << "It doesn't work.";
    }

    return 0;
}
0
Mirsella 26 Ноя 2016 в 17:52

2 ответа

Лучший ответ

Чем больше вы обдумываете сантехнику, тем легче перекрыть сток. - Скотти, Звездный путь III.

Это станет намного проще, если разделить эту задачу на две части:

  1. Переверните цифры в целое число.

  2. Найдите второе целое число, чтобы найти обратное целое число, вычисленное по первой части.

Для первой части предположим, что n содержит число, которое нужно перевернуть.

int modulo=1;
int reversed_n=0;

do
{
     reversed_n = reversed_n * 10 + (n % 10);
     modulo *= 10;
} while ( (n /= 10) != 0);

Конечный результат: если n содержит 345, reversed_n будет 543, а modulo будет 1000. Нам понадобится modulo для второй части.

Причина, по которой цикл построен таким образом, является преднамеренной. Если исходное число равно 0, мы хотим закончить с reversed_n также 0 и modulo как 10.

А теперь мы можем использовать аналогичный подход для поиска второго числа, называемого search, независимо от того, содержит ли оно reversed_n:

for (;;)
{
    if ((search % modulo) == reversed_n)
    {
        std::cout << "Yes" << std::endl;
        return 0;
    }

    if (search < modulo)
        break;

    search /= 10;
}

std::cout << "No" << std::endl;

Полная программа:

#include <iostream>

int main()
{
    int search=654321;
    int n=345;

    int modulo=1;
    int reversed_n=0;

    do
    {
        reversed_n = reversed_n * 10 + (n % 10);
        modulo *= 10;
    } while ( (n /= 10) != 0);


    for (;;)
    {
        if ((search % modulo) == reversed_n)
        {
            std::cout << "Yes" << std::endl;
            return 0;
        }

        if (search < modulo)
            break;
        search /= 10;
    }

    std::cout << "No" << std::endl;
    return 0;
}
1
Sam Varshavchik 26 Ноя 2016 в 15:10
#include <iostream>
#include <cmath>
using namespace std;

int calculateNumLength(int num){
    int length = 0;
    while (num > 0) {
        num = num / 10;
        length++;
    }
    return length;
}

bool check(int longer, int shorter){

    int reversed = 0;
    int digit;
    int shortLength = calculateNumLength(shorter);
    int longLength = calculateNumLength(longer);
    int diffrence = longLength - shortLength;
    int possibleValues = diffrence + 1;
    int possibleNums[possibleValues];

    while ( shorter > 0 ) {
        digit = shorter % 10;
        rev = ( rev * 10 ) + digit;
        shorter = shorter / 10;
    }

    int backstrip = pow(10, diffrence);
    int frontstrip = pow(10, longLength-1);
    int arrayCounter = 0;
    while ( longer > 0 ){
        possibleNums[arrayCounter++] = longer/backstrip;
        if ( backstrip >= 10 ){
            backstrip = backstrip / 10;
        }else{
            break;
        }
        longer = longer % frontstrip;
        frontstrip = frontstrip / 10;
    }
    for (int i=0;i<possibleValues;i++){
         if (possibleNums[i] == rev ){
             return true;
         }
    }
    return false;
}

int main() {
    std::cout << check(654321,123) << std::endl;
    return 0;
}
0
sidoshi 26 Ноя 2016 в 17:13