题目要求:
本题要求实现一个函数,判断任一给定整数
N
是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等。
思想是先判定是否是完全平方数,再建立一个大小为10的数组,数组用于计数完全平方数中相同数字的个数,如果数组中有某个数大于等于2,那么就代表至少有两位数字相同。最开始的代码如下:
int IsTheNumber(const int N)
{
int n = sqrt(N);
int a[10] = { 0 };
int b = N;
if (n * n == b)//如果是完全平方数
{
while (b > 0)//取下每位,对应下标数组元素++
{
int i = b % 10;
a[i]++;
b /= 10;
}
for (int j = 0; j < 10; j++)//判断是否满足有一位计数大于等于2的条件
{
if (a[j] >= 2)
{
return 1;
}
}
}
else
return 0;
}
报错:答案错误。在调试中,发现只要是完全平方数,并不符合数组中某个数字大于等于2的条件,函数的返回值也会是return 1而不是return 0。而只要去掉倒数第二行的else,就答案正确。和室友讨论之后,意识到一个点,int类型的函数默认返回值是几呢?搜索之后,发现int类型的函数默认返回值是1。也就是说,哪怕不满足数组中某个数字大于等于2的条件,只要进入第一个if判断语句,都会默认返回1。而如果去掉了if-else对应的else,只要不满足数组中某个数字大于等于2的条件的话,就会跳出循环,执行最后一句return 0。
所以可以做以下改进:
- 删除倒数第二行的else
int IsTheNumber(const int N) { int n = sqrt(N); int a[10] = { 0 }; int b = N; if (n * n == b)//如果是完全平方数 { while (b > 0)//取下每位,对应下标数组元素++ { int i = b % 10; a[i]++; b /= 10; } for (int j = 0; j < 10; j++)//判断是否满足有一位计数大于等于2的条件 { if (a[j] >= 2) { return 1; } } } return 0; }
- 在第一个if判断中增加一个不满足数组中某个数字大于等于2的条件的return 0,以免函数默认返回值1
int IsTheNumber(const int N) { int n = sqrt(N); int a[10] = { 0 }; int b = N; if (n * n == b)//如果是完全平方数 { while (b > 0)//取下每位,对应下标数组元素++ { int i = b % 10; a[i]++; b /= 10; } for (int j = 0; j < 10; j++)//判断是否满足有一位计数大于等于2的条件 { if (a[j] >= 2) { return 1; } } return 0; } else return 0; }