本题要求实现一个函数,判断任一给定整数N是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等。
函数接口定义:
1 | int IsTheNumber ( const int N ); |
其中N是用户传入的参数。如果N满足条件,则该函数必须返回1,否则返回0。
代码:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 | #include <stdio.h>#include <math.h>int IsTheNumber ( const int N );int main(){ int n1, n2, i, cnt; scanf("%d %d", &n1, &n2); cnt = 0; for ( i=n1; i<=n2; i++ ) { if ( IsTheNumber(i) ) cnt++; } printf("cnt = %d\n", cnt); return 0;}int IsTheNumber ( const int N ){ int n = N; int perfect_square = 0; int same = 0; for (int i = 0; i*i <= n; i++) { if ( i * i == N) { perfect_square = 1; break; } } int length = 0; while (n > 0) { length++; n = n / 10; } n = N; int input[5]; for (int i = 0; i < length; i++) { int temp = n % 10; input[i] = temp; n = n / 10; } if (input[0]==input[1]||input[0]==input[2]||input[0]==input[3]||input[0]==input[4]|| input[1]==input[2]||input[1]==input[3]||input[1]==input[4]|| input[2]==input[3]||input[2]==input[4]|| input[3]==input[4]) { same = 1; } if (same == 1 && perfect_square == 1) { return 1; }else{ return 0; }} |
改进的代码
12345678910111213141516171819 | int IsTheNumber ( const int N ){ int n = N; int root = (int)sqrt(N); if(root * root != N) return 0; int digitCount[10] = {0}; while(n > 0) { int digit = n % 10; digitCount[digit]++; if(digitCount[digit] >= 2) return 1; n /= 10; } return 0;} |
123 | int root = (int)sqrt(N);if(root * root != N) return 0; |
- 裁判程序已经有math.h了,所以应该使用
sqrt() 计算平方根整数部分 - 检查
root*root == N 替代低效的循环
当出现对应数字时,把这个数字的计数器直接加1,可以避免我的代码中复杂的判断逻辑。
12 | if(digitCount[digit] >= 2) return 1; |
当一个数字已经出现2次了,后面的就不用管了,已经符合条件了。