本题要求实现一个函数,判断任一给定整数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 IsTheNumber(const int N) {
//判断N是否是完全平方数
int tmp = sqrt(N);
if ((tmp * tmp) != N)
return 0;
//如果N可以开根号,那就判断是否有重复的数字
else
{
int flag[10] = { 0 }, a;
int m = N;
while (m) {
a = m % 10;
m = m / 10;
if (flag[a])return 1;
else
flag[a] = 1;
}
return 0;
}
}
解释说明
分为两部分,是否是完全平方数和是否有重复数字。
是否是完全平方数:如果是完全平方数,那它开根没有小数。这就好办了,使用math.h
里的开根函数sqrt()
,它的原型是double sqrt(double x);
,返回值是double型的,转换成int型就可以去掉小数。再通过平方值的比较,就能挑选出完全平方数。
是否有重复数字:创建一个标志数组flag[10]
,用来记录出现的数字。除10取模后的数字就是最后一位数字,例如144%10
会得到4,这正是144的最后一位数字,然后标记flag[4]=1
。循环后的14.4取模为4,这与上个记录冲突,返回1。
如果上述方案有不妥或是你有更好的方案,还望不吝赐教。