6-7 统计某类完全平方数
题目:
本题要求实现一个函数,判断任一给定整数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
要点:
这道题中完全平方数的判断并不难,可以利用int与double数据类型之间精度的不同对N开方来直接判断是否符合完全平方数;
但是在第二个要求中:至少有两位数字相同,这个要求着实让我这个初学者有点头疼。因为输入数据的位数可以是任意的,所以如果要把每一位的值都求出来然后保存之后在比较,就会有这样的问题:在提前不知道位数的情况下,应该设计多大的数组来存放每一位的数据呢?后来询问了同学之后,建议我换个思路,不用保存每一位,而是提前定义一个长度为十,元素均为0的数组,以数组下标代表数字1~9,利用循环计算每一位的数值,但并不保存,而是相应的让该数组下标的元素加一。只要任意的元素值为二,就跳出循环。真是豁然开朗,有时候换个思路真的就是柳暗花明。
题解
int IsTheNumber(const int N)
{
int i,a,b;
int m[10]={0};
if(N%8==0||N%8==1||N%8==4)/*这里应用了完全平方数的性质预先排除了5/8的数据,但其实在原题目中已经包含了<math.h>的头文件可以直接利用Int、double数据之间的差异来直接判断是否为完全平方数。
*/
{
for (i=0;i*i<N;i++);
if(i*i==N)
{
a=N;
while(a)
{
b=a%10;
m[b]++;
if (m[b]==2)
{
return 1;
break;
}
a=a/10;
}
}
else return 0;
}
return 0;
}