提问人:blake 提问时间:2/13/2021 最后编辑:Vlad from Moscowblake 更新时间:2/13/2021 访问量:1435
找出一个数字的所有数字是否相等
finding out if all the digits of a number are equal
问:
所以我想首先说我已经解决了这个问题,但有一些东西困扰着我,
首先是代码:
#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
另外,在某种程度上,我仍然是一个初学者,所以我对任何缩进错误表示歉意。
答:
2赞
Zois Tasoulas
2/13/2021
#1
全局变量保留其值。在您的例子中,if 是全局的,一旦设置为 (within ),它将保留该值。代码中没有其他地方可以再次制作它。flag
0
controlNumber
1
使其成为函数的局部变量将导致它在每次调用函数时初始化为。1
编辑:如果要将其设置为全局,可以将其设置为每次返回,即之前或之后。1
controlNumber
0
printf("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
例如,如果您将更改函数中的常量并使其等于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
评论
8
8
88
888