确定一个数的所有数字是否相等

3

首先,我想说的是我已经解决了这个问题,但有些事情仍让我感到困扰。

以下是代码:

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

只有当全局变量flag在函数controlNumber内被声明为局部变量且值为1时,此代码才能工作。我无法确定为什么情况会是这样,因为逻辑应该还是相同的。

另外,我仍然是一个初学者,所以对于任何缩进错误我先表示抱歉。


这是其中一个最好采用“反向”解决的问题。你得到一个数字,比如说是“8”。现在只需重复检查你的数字是否大于等于“8”,“88”,“888”等等,直到它变得小于或等于它。 - Eugene Sh.
2个回答

4

首先,定义一个依赖全局变量的函数是非常糟糕的想法。实际上,这就是你的程序出现错误的原因。你忘记在每次调用函数之前将全局变量标志重置为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

例如,如果您更改函数中的常量Base并将其设置为8
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

例如,在这种情况下,数字45在八进制表示中具有相同的数字,因为在八进制表示中,该数字写成055

2
全局变量会保留其值。在你的情况下,如果flag是全局的,在controlNumber函数内设置为0后,它将保持该值。代码中没有其他地方可以使其再次变为1
将其作为函数的局部变量会导致每次调用函数时都初始化为1编辑:如果您想将其设置为全局变量,则可以在printf("not all digits are equal\n");之前或之后,即在controlNumber返回0之前将其设置为1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接