gpt4 book ai didi

c - 识别环绕号码

转载 作者:行者123 更新时间:2023-11-30 21:12:50 25 4
gpt4 key购买 nike

让我们定义一个要构造的数字的行程,如下所示:访问该数字的最左边的数字。该数字告诉您接下来要访问哪个数字:向右移动,如有必要,环绕到数字的左端,与该数字的值一样多的位置。继续此过程,直到第二次访问某个数字。如果所有数字都已被访问,则该数字符合环绕数字的资格。否则,就不会。

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

<小时/>

Write a program that accepts as input a positive number and reports whether or not it is a wrap around number.

输入格式:

Input consists of a single positive number.

假设

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

输出格式:

Refer sample output for formatting details. 

示例输入 1:

872

示例输出 1:

872 is a wraparound number

示例输入 2:

351267813

示例输出 2:

351267813 is not a wraparound number.
<小时/>

这是我的程序..它显示示例输入 1 的错误输出和示例输入 2 的正确结果。

#include<stdio.h>
int main()
{
int a[9],number;
scanf("%d",&number);
int i;
for(i=0;i<9;i++)
{
a[i]=-1;
}
int temp=0,digit=0,index=0;
temp=number;
while(temp!=0)
{
digit=(temp%10);
a[index]=digit;
index=index+1;
temp=temp/10;
}
int size=0,checksize=-1;
i=0;
for(i=0;i<9;i++)
{
if(a[i]==-1)
{
size=i;
checksize=0;
break;
}
}
if(checksize==-1)
size=9;
int isAWrapAround=0;
int x=0,count=size-1,remaining=0,arraysize=size;
for(i=(arraysize-1);i>=0;i--)
{
x=a[count];
a[count]=-1;
if(x!=-1)
{
if(count-x>=0)
{
count=count-x;
}
else
{
remaining=x-count;
count=0;
do
{
if(remaining<=arraysize)
{
count=arraysize-remaining;
break;
}
else
{
count=remaining-arraysize;
remaining=remaining-arraysize;
}
}
while(count>arraysize-1);
}
}
else
{
isAWrapAround=-1;
}
}
if(isAWrapAround==0)
{
printf("%i is a wraparound number",number);
}
else
{
printf("%i is not a wraparound number",number);
}
return 0;
}

无法找出错误。

最佳答案

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

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

关于c - 识别环绕号码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31717310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com