本题要求实现一个函数,判断任一给定整数 N 是否满足条件:它是完全平方数,又至少有两位数字相同,如 144、676 等。
函数接口定义:
int IsTheNumber ( const int N );
其中 N 是用户传入的参数。如果 N 满足条件,则该函数必须返回 1,否则返回 0。
裁判测试程序样例:
#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;
}
/* 你的代码将被嵌在这里 */
输入样例:
105 500
输出样例:
cnt = 6
来源:
来源:PTA | 程序设计类实验辅助教学平台
链接:https://pintia.cn/problem-sets/14/exam/problems/739
提交:
题解:
/*
* 判断任一给定整数 N 是否满足条件:它是完全平方数,又至少有两位数字相同,如 144、676 等,
* 如果 N 满足条件,则该函数必须返回 1,否则返回 0
*/
int IsTheNumber(const int N) {
// 满足完全平方数条件(若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数)
if ((int) sqrt(N) * (int) sqrt(N) == N) {
// 二维数组 digits 存储各位数字出现的次数
int digits[10][2] = {{0, 0},{1, 0},{2, 0},{3, 0},{4, 0},{5, 0},{6, 0},{7, 0},{8, 0},{9, 0},};
// 因 N 为 const 常量不可变,故赋值给 n
int n = N;
// 获取数字 N 的各位数字,并利用 digits 二维数组统计各位数字出现的次数
while (n != 0) {
int lastNum = n % 10;
digits[lastNum][1]++;
n /= 10;
}
// 遍历各位数字出现的次数,若某个数字至少出现了两次则 N 符合条件
for (int i = 0; i < 10; i++) {
if (digits[i][1] >= 2) {
return 1;
}
}
}
return 0;
}