这是题目:
思路:先实现1完全平方数的判断,再考虑2是否有重复出现的数字
按照思路分别写出两个函数:
1完全平方数的判断
int A(int N)
{
if (N < 0)
return 0;
//负数不存在完全平方数。别忘记考虑它的存在了
int sqrtN = (int)sqrt((double)N);
//sqrt函数一般的输入值是double类型的。
// 前面的(int)强制将计算结果转化为整数,如果计算结果是小数,比如3.14,结果会被截断为3
return sqrtN * sqrtN == N;
//判断上一步得到的sqrtN的平方是否为N,如果被截断过,则等号不成立,返回0;
// 反之成立的话返回1
}
2至少有两个数字相同
int B(int N)//追踪0~9数字出现的个数,如果某数字出现个数>=2,则满足条件
{
if (N < 0)
N = -N;
int arr[10] = { 0 }; // 用于存储每个数字出现的次数
while (N > 0)
{
int linshicunchu = N % 10;//取出N的最后一位数存储在linshicunchu中
arr[linshicunchu]++;//数组arr中对应的数字加一
if (arr[linshicunchu] > 1)
return 1;//如果出现的次数大于1,则返回1,不需要再进行之后的检验
N /= 10;//抹去已经检验过的最后一位数字
}
return 0;//直到最后也没有检验出两个一样的数,则返回0
}
然后将代码集中在一个函数里:
注:因为这里在传值的时候使用了const,所以不能改变N的值,故用n = N来代替计算,后面换成n即可。
int IsTheNumber ( const int N )
{
int n = N;
if (n <= 0)
return 0;
int flag1 = 0;
int sqrtN = (int)sqrt((double)n);
if (sqrtN * sqrtN == n)
{
flag1++;
}
int flag2 = 0;
int arr[10] = { 0 };
while (n > 0)
{
int linshicunchu = n % 10;
arr[linshicunchu]++;
if (arr[linshicunchu] > 1)
{
flag2 = 1;
break;
}
n /= 10;
}
if (flag1 == 1 && flag2 == 1)
{
return 1;
}
return 0;
}