找到最大值在数字上的位置

Find the position of a max on a number

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

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

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

例如:
输入:

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("%d\n",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: %d\n1: %d\n2: %d\n3: %d\n4: %d\n",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 #

使用 fgets() 并保持输入为 string 格式的工作可能会减少步骤。 (验证它是否包含数字字符。) 另外,一组值将更容易保持价值链以索引关系。

这是获取您描述的信息的另一种方法:

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, "\r\n")] = 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.\n\nctrl-c to exit\n...Or enter a number : \n", inBuf);
        }
    };
    return 0;
}

你的程序的问题是在这个循环中

    while (num>0) {

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

    }

变量pos仅在找到大于先前数字的数字时递增。例如如果你有这样的号码

51234 

那么第一个最大的数字是4并且变量pos设置为1。之后,当找到下一个最大的数字 5 时,变量 pos 递增并变得等于 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: %zu\n", i, total[i] );
    }
    
    return 0;
}

为输入

542 8965 7452 1111 12 8 6532 98745 15926 #

程序输出为

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

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 input\n", 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 input\n", stderr);
            return 1;
        }
    }
    for( int i = 0; i < 5; i++ ){
        printf("%d: %d\n", i, br[i]);
    }
    return 0;
}