识别环绕号码

时间:2015-07-30 07:09:17

标签: c algorithm

让我们通过如下构造的数字来定义旅程:访问该数字的最左边的数字。该数字告诉您下一个要访问的数字:向右移动,必要时环绕数字的左端,与数字的值一样多。继续此过程,直到第二次访问某个数字。如果访问过所有数字,则该数字可以作为环绕号码。否则,它没有。

例如,考虑数字32741。我们访问最左边的数字,告诉我们接下来访问右边三位数,即4。接下来,我们访问74右侧的四个位置),然后是1,然后再访问3。这次旅行已经第二次返回到一个数字而没有访问所有数字。 (从未访问2。)因此,32741不是环绕数字。另一方面,3233是一个环绕数字,因为我们首先访问最左边的3,然后是最右边的3,然后是中间的3,然后是{ {1}},然后返回最右边的2。访问了所有四位数字。

  

编写一个程序,接受正数作为输入并报告   是否是一个环绕数字。

输入格式:

3

假设

Input consists of a single positive number.

输出格式:

Assume that the input number is less than or equal to 400000000.

示例输入1:

Refer sample output for formatting details. 

示例输出1:

872

示例输入2:

872 is a wraparound number

示例输出2:

351267813

这是我的程序..示例输入1显示错误输出,样本输入2显示错误。

351267813 is not a wraparound number.

无法弄清楚错误。

1 个答案:

答案 0 :(得分:-1)

刚写了一个简单的代码,演示了如何解决问题。采取一些想法,改善你的想法。干杯

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>

//! Max amount of digits in input value
#define maxInputDigits  9

//! Highest input value
static const uint32_t maxInputValue = 400000000;

int main()
{
    uint32_t inputValue;
    uint8_t digitValue[maxInputDigits], tmpDigitValue[maxInputDigits];
    uint8_t nrOfDigits = 0;
    bool digitVisit[maxInputDigits] = {false, false, false, false, false, false, false, false, false};

    uint32_t dividend = 10;
    uint32_t divisor;

    uint8_t cnt;
    uint8_t index;
    uint8_t jumps;


    // Get input from user
    scanf("%d", &inputValue);

    // Input valid?
    if ( inputValue > maxInputValue )
    {
        printf("Input value condition: <= %d", maxInputValue);
    }


    // Separate all digits from input value into its own index
    divisor = inputValue;

    while( divisor != 0 )
    {
        tmpDigitValue[nrOfDigits] = (divisor % dividend)/(dividend / 10);
        divisor /= 10;

        nrOfDigits++;
    }


    // Reverse the order, so that the least digit becomes left most in the array (digitValue[0])
    for ( cnt = 0; cnt < nrOfDigits; cnt++ )
    {
        digitValue[cnt] = tmpDigitValue[(nrOfDigits-1)-cnt];
    }

    printf("Nr of digits: %d\n\n\n", nrOfDigits);


    // Set the start index (left most)
    index = 0;

    // Start the process
    while ( true )
    {
        printf("Current value[index]: %d[%d]\n",digitValue[index], index);
        // Already been checked?
        if ( digitVisit[index] == true )
        {
            break;
        }
        else
        {
            digitVisit[index] = true;
        }

        // Amount of jumps
        jumps = digitValue[index];

        // Jump to next index
        while ( jumps > 0 )
        {
            index = ( index >= (nrOfDigits - 1) ) ? 0 : (index + 1);
            jumps--;
        }

    }


    // Check if any of the digits has not been visited
    for ( cnt = 0; cnt < nrOfDigits; cnt++ )
    {
        if ( digitVisit[cnt] == false )
        {
            printf("\n%d is not a wraparound number\n", inputValue);
            return 0;
        }
    }

    printf("%d is a wraparound number\n", inputValue);

    return 0;
}