今天的这道题目呢,相较于之前的题目而言,难度有些提升。
既要求统计完全平方数,同时也要求能在完全平方数中找到至少有两位数字相同的数。
我们知道,完全平方数,就是两个相同的数进行相乘所得到的。
换句话说,完全平方数开算术平方根后,得到的数就只有一个数。
以1、4、9为例,开平方根后,得到1、2、3,同时,1、2、3的完全平方数大家也可以发现,就是1、4、9这三个数。

在这道题目中,是以144、676为例,比方说144是12的完全平方,676则是26的完全平方。
但是呢,这道题目并不仅仅是让我们找到这些完全平方数,而是给定一个整数N,且这个整数N的范围是在n1到n2之间的。
梳理逻辑
根据题目要求,我们先来梳理一下逻辑,遇到函数题没有头绪的时候,最重要的办法就是进行反推。
根据题目给定的测试用例反推回去,就能够推理出题目的逻辑了。

很显然,本道题目的主要逻辑分为三部分:
1、找出完全平方数。
2、找出具有两个相同数字的完全平方数。
3、数数,统计这些数的数量,得到最终结果。
先是判断完全平方数,可以定义一个变量n,如果n的平方等于要求的值,则说明N为完全平方数,之后再来处理N,则N要满足其中有两个数是相同的情况,那就得将N给拆分开来,比方说以121为例,那就要拆分成数字1、2、1,然后比较,其中有两个1,则满足要求。
代码实现
//统计某类完全平方数
#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;
}
int IsTheNumber ( const int N )//对单独的数字N进行判断即可,N是常量
{
int Perfect_seeksquare=N;//定义要找寻的完全平方数 121为例
int store[10]={0};
int n=sqrt(N);//n=11
if(n*n==N)//11*11=121,主要目的是用来判断完全平方数的
{//如果要判断
while(Perfect_seeksquare!=0)//121!=0
{
store[Perfect_seeksquare%10]++;//store[1] = 1+0 = 1
//store[2] = 1+0=1;
//store[1] = 1+1=2;
//很显然,这里可以发现,当某个特定位置的数大于1的时候,则说明有多个数字
Perfect_seeksquare=Perfect_seeksquare/10; //12、1
}
for(int i=0;i<10;i++)
{
if(store[i]>1)//只要判断是否大于1即可
{
return 1;
}
}
return 0;
}
else{
return 0;
}
}
结果测试


总结
函数题相对于编程题来说,难度既可以说难,也可以说是简单,难是难在梳理逻辑的这一块,简单是简单在不需要从头开始梳理逻辑,可以根据题目给定的测试程序样例来梳理。