c语言 - 找到数字上最大值的位置



我有C程序需要找到一个数字的位置。它是这样的:

从标准输入中,我们输入未知数量的正数。这些数字最多有 5 位数字,我们读取新数字,直到用户输入不是数字的值。我需要从右到左找到数字的最大位数的位置。如果 max 数字有多个实例,请使用最右侧的位置。

程序需要输出位置和在该位置找到数字的最大位数的次数。

例如:输入:

97654 48654 12345 12343 1263 12443 12643  12777 #

输出:

0: 2
1: 3
2: 1
3: 1
4: 1

因为

Position: 4      3        0    1    1     1    2        0
v      v        v    v    v     v    v        v
97654 48654 12345 12343 1263 12443 12643  12777 #

该程序适用于此特定测试用例

代码下的更多测试用例。

这是我的代码:

#include <stdio.h>
int main(){
int n;
int max;
int num,digit,pos,br0=0,br1=0,br2=0,br3=0,br4=0;
while (scanf("%d",&n)) {
max =0;
num = n;
pos=0;
while (num>0) {
digit = num%10;
if(digit > max){
max=digit;
pos++;
}
num/=10;
}
printf("%dn",pos);
switch (pos) {
case 1: br0++; break;
case 2: br1++; break;
case 3: br2++; break;
case 4: br3++; break;
case 5: br4++; break;
}
}
printf("0: %dn1: %dn2: %dn3: %dn4: %dn",br0,br1,br2,br3,br4);
return 0;
}

该程序适用于某些测试用例,例如

97654 48654 12345 12343 1263 12443 12643 12777 #
123 456 789 987 654 321 #

但不适用于:

542 8965 7452 1111 12 8 6532 98745 15926 #
75386 86142 94285 15926 35724 #

程序的问题在于在此循环中

while (num>0) {
digit = num%10;
if(digit > max){
max=digit;
pos++;
}
num/=10;
}

仅当找到大于前一位数字的数字时,变量pos才会递增。例如,如果你有一个这样的数字

51234 

然后第一个最大的数字是4,变量pos设置为1。之后,当找到下一个最大的数字时,即变量pos5的数字递增并等于2而实际上最大的数字5位于位置5

您需要再引入一个变量,例如

max =0;
num = n;
pos=1;
int i = 1;
do
{
digit = num%10;
if(digit > max){
max=digit;
pos = i;
}
} while ( ( num /=10 ) && ( i++ != 5 ) );

我会按以下方式编写程序

#include <stdio.h>
int main(void) 
{
enum { N = 5 };
const unsigned int Base = 10;

size_t total[N] = { 0 };

unsigned int n;

while ( scanf( "%u", &n ) == 1 )
{
unsigned int pos = 0;
unsigned int max_digit = 0;
unsigned int i = 0;

do
{
unsigned int current_digit = n % Base;

if ( max_digit < current_digit )
{
pos = i;
max_digit = current_digit;
}
} while ( ( n /= Base ) && ( ++i != N ) );

++total[pos];
}

for ( unsigned int i = 0; i < N; i++ )
{
printf( "%u: %zun", i, total[i] );
}

return 0;
}

对于输入

542 8965 7452 1111 12 8 6532 98745 15926 #

程序输出为

0: 3
1: 0
2: 3
3: 2
4: 1

使用fgets()和保持输入为字符串格式来执行工作的步骤可能更少。 (验证它是否包含数字字符。 此外,值数组将更容易将值区域保留到索引关系。

以下是获取您所描述信息的另一种方法:

int main(void) {
char inBuf[20] = {0};
int index = 0;
int loops = 0;
int maxPos = 0;
int maxVal = 0;

printf("Enter a number : ");
while (fgets(inBuf, sizeof inBuf, stdin) && loops < 6) {

inBuf[strcspn(inBuf, "rn")] = 0;//remove unwanted white space
if(strstr(inBuf, "#")) return 0;//exit if "#"
if(digits_only(inBuf))
{
index = 0;
maxVal = inBuf[index];
while(inBuf[index])
{
if(inBuf[index] >= maxVal)
{
maxVal = inBuf[index];
maxPos = index;
}
index++;                    
}
printf("%d:%d n", loops, maxPos);
loops++;
inBuf[0]=0;
}
else
{
printf("n%s contains non-numeric characters, it cannot be converted.nnctrl-c to exitn...Or enter a number : n", inBuf);
}
};
return 0;
}

scanf是错误的工具。 (scanf(几乎)总是错误的工具)。 对于此特定问题,您确实希望将输入视为字符串。 只要你不想接受看起来像"1e3"的输入(这是整数的完全有效的表示形式),你可以做这样的事情:

#include <stdio.h>
#include <assert.h>
#include <ctype.h>
#include <string.h>
int
main(void){
int max = -1;
int br[5] = {0};
int maxpos = -1;
int len = 0;
int c;
while( (c = getchar()) != EOF ){
if( c && strchr("0123456789", c) ){
if( ++len > 5 ){
fputs("invalid inputn", stderr);
return 1;
}
assert( len > 0 && len < 6 );
if( c > max + '0' ){
maxpos = len;
max = c - '0';
}
} else if( isspace(c) ){
if( max > -1 ){
br[len - maxpos] += 1;
}
maxpos = -1;
len = 0;
max = '0' - 1;
} else {
fputs("invalid inputn", stderr);
return 1;
}
}
for( int i = 0; i < 5; i++ ){
printf("%d: %dn", i, br[i]);
}
return 0;
}

最新更新