让我们通过如下构造的数字来定义旅程:访问该数字的最左边的数字。该数字告诉您下一个要访问的数字:向右移动,必要时环绕数字的左端,与数字的值一样多。继续此过程,直到第二次访问某个数字。如果访问过所有数字,则该数字可以作为环绕号码。否则,它没有。
例如,考虑数字32741
。我们访问最左边的数字,告诉我们接下来访问右边三位数,即4
。接下来,我们访问7
(4
右侧的四个位置),然后是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.
无法弄清楚错误。
答案 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;
}