6-7 统计某类完全平方数
分数 20
本题要求实现一个函数,判断任一给定整数N
是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等。
函数接口定义:
#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; f or ( i=n1; i<=n2; i++ ) { if ( IsTheNumber(i) ) cnt++; } printf("cnt = %d\n", cnt); return 0; } /* 你的代码将被嵌在这里 */
其中N
是用户传入的参数。如果N
满足条件,则该函数必须返回1,否则返回0。
裁判测试程序样例:
输入样例:
105 500
输出样例:
cnt = 6
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
方法一:
while (1) {
//计算i的平方
num = i * i;
//如果num对于N,则表示该数不是完全平方数,return 0
if (num > N) {
return 0;
}
//该数是完全平方数
if (num == N) {
// 分别拿到该数的每个位的数,count数组索引存储对应的数
// 如count[1]存储数字1出现的次数
int count[10] = {0};
while (num != 0) {
/**
* num % 10 可以拿到最低位的数,如123 % 10 = 3
* num /10 可以抹去最低位的数,如123 /10 = 12
*/
int tmp = num % 10;
count[tmp]++;
//遍历count[],如果某个数的count[]存在两位数,则return 1
for (int j = 0; j < 10; ++j) {
if (count[j] >= 2) {
return 1;
}
}
num /= 10;
}
}
//i递增
i++;
}
}
方法二:
首先,我们可以编写一个函数来判断一个整数是否是完全平方数。可以利用数学函数sqrt()来求平方根,然后判断平方根是否为整数。
然后,我们需要判断一个整数是否至少有两位数字相同。可以将整数转换为字符串,然后遍历字符串,统计每个数字出现的次数,如果至少有一个数字出现了两次或以上,则返回true。
最后,将这两个功能结合起来,即可完成题目要求的函数实现。
以下是完整的代码实现:
#include <stdio.h>
#include <math.h>
int IsTheNumber(const int N)
{
int isPerfectSquare = 0;
int hasDuplicateDigit = 0;
// 判断是否是完全平方数
int sqrtN = sqrt(N);
if (sqrtN * sqrtN == N) {
isPerfectSquare = 1;
}
// 判断是否至少有两位数字相同
char strN[20];
sprintf(strN, "%d", N);
int digitCounts[10] = {0}; // 数字出现次数的计数数组
for (int i = 0; strN[i] != '\0'; i++) {
digitCounts[strN[i] - '0']++;
}
for (int i = 0; i < 10; i++) {
if (digitCounts[i] >= 2) {
hasDuplicateDigit = 1;
break;
}
}
// 返回最终结果
if (isPerfectSquare && hasDuplicateDigit) {
return 1;
} else {
return 0;
}
}
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;
}