本题要求实现一个函数,判断任一给定整数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
做法一
- 将数字中的位数拆开放入数组,个位数 N % 10,十位数 N / 10 % 10,百位数 N / 10 / 10 % 10,以此类推
- 比较数组中的数字是否有相同
- 如果有相同的数字,那么继续判断是否是完全平方数
int y = x * x; if (y == N)
- 如果是,返回 1。如果不是,返回 0
int IsTheNumber ( const int N ) {
int arr[10] = {0}; // 不超过 int 存储的最大值
int count = 0;
int num = N; // 需要对 N 进行修改,所以赋值给 num
// 个位数 N % 10,十位数 N / 10 % 10,百位数 N / 10 / 10 % 10,以此类推
// 只剩个位数时就是最高位的值
while(num >= 10) {
arr[count++] = num % 10;
num /= 10;
}
arr[count] = num; // 将最高位的值存储到数组中
int x = sqrt(N); // 将 N 开根号
int y = x * x; // 计算 x 的平方,与 N 值进行判断是否为完全平方数
// 使用 count 作为循环次数,可以只取到我们将 num 拆开的值
for (int i = 0; i <= count; i++) {
// 数组中的值进行比较,第一个和第二个比,以此类推
for (int j = i+1; j <= count; j++) {
// 当有相同的值时进入判断,满足至少两位数字相同
if (arr[i] == arr[j]) {
// 属于完全平方数
if (y == N) {
return 1;
} else {
return 0;
}
}
}
}
return 0;
}
做法二
- 判断数字是否是完全平方数
- 拆开数字中的个位数、十位数等作为数组下标
- 使用
arr[count]++;
如果元素的值超过 1,则代表有相同的数字 - 使用 for 循环遍历数组,寻找是否有元素的值超过 1,如果有的话,则返回 1
int IsTheNumber ( const int N ){
int arr[10] = {0}; // 数字 0 - 9
int count;
int num = N; // 需要对 N 进行修改,所以赋值给 num
int x = sqrt(N); // 将 N 开根号
// 计算 x 的平方,与 N 值进行判断是否为完全平方数
if(x*x == N){
while(num){
// 拆开数字中的个位数、十位数等作为数组下标
// 例如 arr[3]++, arr[2]++, 又来一个 arr[3]++
// 那么 arr[2] = 1, arr[3] = 2,超过 1 就代表有相同的数字
count = num % 10;
arr[count]++;
num /= 10;
}
// 使用 count 作为循环次数,可以只取到我们将 num 拆开的值
for (int i = 0; i < 10; i++) {
// 如果数组中有元素的值超过 1,说明有完全平方数中有相同的数字
if (arr[i] > 1) {
return 1;
}
}
}
return 0;
}