找出一个数字的所有数字是否相等

finding out if all the digits of a number are equal

提问人:blake 提问时间:2/13/2021 最后编辑:Vlad from Moscowblake 更新时间:2/13/2021 访问量:1435

问:

所以我想首先说我已经解决了这个问题,但有一些东西困扰着我,

首先是代码:

#include <stdio.h>

int flag = 1;

int controlNumber(int);

int main() {    
    int array[10] = { 233, 45, 777, 81, 999999, 36, 90, 88, 11, 61 };   
    int i;  
    int c;  

    for (i = 0; i < 10; i++) {
        printf("%d >>  ", array[i]);
        c = controlNumber(array[i]);
        if (c == 1) {           
            printf("all digits are equal\n");
        } else {
            printf("not all digits are equal\n");
        }
    }
    return 0;
}

int controlNumber(int a) {
    int q = a;
    int r = a % 10;
    int temp;
    
    while (q != 0) {
        temp = q % 10;
        if (temp == r) {
            q = q / 10;
        } else {
            flag = 0;
            return flag;
        }
    }
    return flag;
}

只有当全局变量在函数范围内以 的值 成为本地变量时,代码才有效,我无法真正弄清楚为什么会这样,因为逻辑应该仍然相同。flagcontrolNumber1

另外,在某种程度上,我仍然是一个初学者,所以我对任何缩进错误表示歉意。

数组 c 全局变量 相等 函数定义

评论

0赞 Eugene Sh. 2/13/2021
这是最好在“反向”中解决的问题之一。你得到一个数字,说它是 .现在,只需根据 、 等反复检查您的数字,直到它变得小于或等于它。8888888

答:

2赞 Zois Tasoulas 2/13/2021 #1

全局变量保留其值。在您的例子中,if 是全局的,一旦设置为 (within ),它将保留该值。代码中没有其他地方可以再次制作它。flag0controlNumber1

使其成为函数的局部变量将导致它在每次调用函数时初始化为。1

编辑:如果要将其设置为全局,可以将其设置为每次返回,即之前或之后。1controlNumber0printf("not all digits are equal\n");

4赞 Vlad from Moscow 2/13/2021 #2

对于初学者来说,定义一个依赖于全局变量的函数是一个非常糟糕的主意。事实上,这是你的程序错误的原因。在调用函数之前,您忘记每次将全局变量标志重置为 1。

该函数可以按以下方式定义,无需任何冗余全局变量

int controlNumber( int n )
{
    const int Base = 10;

    int digit = n % Base;

    while ( ( n /= Base ) && ( n % Base == digit ) );

    return n == 0;
} 

这是一个演示程序。

#include <stdio.h>

int controlNumber( int n )
{
    const int Base = 10;

    int digit = n % Base;

    while ( ( n /= Base ) && ( n % Base == digit ) );

    return n == 0;
} 

int main(void) 
{
    int array[] = { 233, 45, 777, 81, 999999, 36, 90, 88, 11, 61 };
    const size_t N = sizeof( array ) / sizeof( *array );
    
    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%d >>  ", array[i] );

        if ( controlNumber( array[i] ) )
        {
            printf( "all digits are equal\n");
        }
        else 
        {
            printf( "not all digits are equal\n" );
        }
    }
    
    return 0;
}

程序输出为

233 >>  not all digits are equal
45 >>  not all digits are equal
777 >>  all digits are equal
81 >>  not all digits are equal
999999 >>  all digits are equal
36 >>  not all digits are equal
90 >>  not all digits are equal
88 >>  all digits are equal
11 >>  all digits are equal
61 >>  not all digits are equal

例如,如果您将更改函数中的常量并使其等于Base8

int controlNumber( int n )
{
    const int Base = 8;  //10;

    int digit = n % Base;

    while ( ( n /= Base ) && ( n % Base == digit ) );

    return n == 0;
} 

那么你会得到以下结果。

233 >>  not all digits are equal
45 >>  all digits are equal
777 >>  not all digits are equal
81 >>  not all digits are equal
999999 >>  not all digits are equal
36 >>  all digits are equal
90 >>  not all digits are equal
88 >>  not all digits are equal
11 >>  not all digits are equal
61 >>  not all digits are equal

例如,在这种情况下,数字在八进制表示中具有相同的数字,因为在八进制表示中,数字的写法是 .45055