原题目:
本题要求实现一个函数,判断任一给定整数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
分析:
1.要满足题设的两个条件:1).完全平方数,2).至少有两位相同,初次初次看到题目时,直接想到的就是暴力1-√n判断,看了网上几个帖子后,我们可以使用sqrt(),然后强制类型转换为int,再平方后看是否相等即可,这到是一个不错的方法,时间消耗很少。对于至少两位相同,我使用对于它的每一位都保存到H[10]里面,数组初始值为0,数组下标代表当前这一位数,值表示个数,最后判断只要一个数组下标的值大于1即可(根据初始值的不同,判断条件不同)。最后在两者同时成立情况下,该正整数满足条件,返回1
2.代码还是之前暴力的代码,没有修改,既然可以过,那就AC吧,
代码:
int IsTheNumber ( const int N )
{
//i ,j 为标记,当两者情况同时成立时,即都为1 则返回1
int i=0,j=0,k,n;
int H[10];
//初始数组为0,用来存取每个数字出现的个数
for(k=0;k<10;k++)
{
H[k]=0;
}
//暴力判断是否为完全平方数
for(k=0;k<=N;k++)
{
if(k*k==N)
{
i=1;
break;
}
}
//取每一位并保存个数
for(n=N,k=n%10;n!=0;k=n%10)
{
H[k]++;
n=n/10;
}
//对于个数大于1的,即存在至少有两位相同,
for(k=0;k<10;k++)
{
if(H[k]>1)
{
j=1;
break;//存在后,直接跳出循环,无需判断之后的情况
}
}
//对于同时满足这两种情况的返回1 否则,返回0
if(i==1&&j==1)
{
return 1;
}
else
{
return 0;
}
}