检查其中是否包含其他数字的程序

时间:2016-11-26 14:52:39

标签: c++ function palindrome

我刚刚开始涉足编码问题,我遇到了一个我几天都无法解决的问题,而我能在网上找到的最接近的一个程序是检查是否有数字包含一个特定的数字,但这并不适用于我的情况,我不认为。问题是让用户输入两个正数并检查第二个数字的反向是否包含在第一个数字中。例如,如果输入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;
}

2 个答案:

答案 0 :(得分:1)

  

你越是思考管道,就越容易   堵住排水管。 - Scotty,Star Trek III。

如果将此任务分为两部分,则会变得更加容易:

  1. 反转整数中的数字。

  2. 在第二个整数中搜索由第一部分计算的反转整数。

  3. 对于第一部分,假设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 :(得分:0)

#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;
}