统计某类完全平方数
作者:yyyyzzz 、疯狂的SmileZ
本题要求实现一个函数,判断任一给定整数N是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等。
解题思路
什么是完全平方数
完全平方指用一个整数乘以自己例如1乘1,2乘2,3乘3等,依此类推。若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。
解题方法:
判断当前函数接收到的数是否为完全平方数,可使用for循环+试乘法进行判断。本题给出了math库文件,也可直接使用函数判断是否为完全平方数。
for循环+试乘法
从1到N/2里面找一个数乘以本身等于N就是完全平方数,为什么要写N/2呢,因为如果这个数比自身的一半还大那么它的平方肯定大于了N这个数。(N/2可以换成sqrt(N))。
for(i=1;i<=N/2;i++)//判断是否为完全平方数
if(i*i==N) {是完全平方数}
sqrt函数+强制转换
因为sqrt()函数开根号出来是小数,因此我们要进行强制转换取整,取整后再相乘等于N的话就是完全平方数,不是完全平方数的数开根号必然有非0的小数,取整后再相乘就会不等于N。
如16 sqrt(16) = 4.0
如17 sqrt(17) =4.123
(int)sqrt(N)*(int)sqrt(N)==N
又有两位数字相同
判断该数是否至少有两位数相同,可以借用桶子思想,定义一个a[10]数组,然后利用循环取出每一个数,每取出一个数,就在数组相应数字位+1,只要数组有一个元素大于等于2,则满足要求。
因为数字是0-9,所以我们正好可以用到一个数组,运用下标来对其出现的次数进行统计。
方法一 for+试乘法
因为本题目需要同时满足两个要求,可定义一个flag,当满足一个条件时,flag就进行加一。当执行完前面两个部分时,若flag等于二,则这个数满足题目要求。
int IsTheNumber ( const int N )
{
int i,flag=0,a[10]={0},j=0;
for(i=1;i<=N/2;i++)//判断是否为完全平方数
if(i*i==N) {flag++;break;}
for(i=N;i!=0;i=i/10)//取出每一位,并在数组中进行记录
{
a[i%10]++;
}
for(i=0;i<=9;i++)//判断0-9中是否有出现过两次或两次以上的数
if(a[i]>=2) {flag++;break; }
if(flag>=2) return 1;//满足两个条件,该数符合题目条件,返回真
return 0;
}
sqrt函数+强制转换
先用sqrt函数判断它是不是完全平方数,再统计这个数每个数字出现的次数,如果有一个数字出现的次数大于了2次就直接返回1,因为这个数满足了条件,否则就返回0。
int IsTheNumber ( const int N ) {
if ((int)sqrt(N)*(int)sqrt(N) != N) {
return 0;
}
int t = N;
int p[10] = {0};
while (t) {
p[t%10]++;
t=t/10;
}
for (int i = 0; i < 10; i++) {
if (p[i] >= 2) {
return 1;
}
}
return 0;
}