题目:求200000以内的自守数。
要求编写函数selfhold,判断一个数是否是一个自守数,
若是,则返回1,否则返回0。
自守数是指一个数的平方的尾数等于该数自身的自然数。例如:
25*25=625 76*76=5776 9376*9376=87909376
在做到这道题时,查阅了很多种解法,但很多并未考虑到数据溢出的问题,或者思维难度稍高(作者能力问题),所以自己写了一遍。
本题解法利用乘法竖式计算的原理:
于是代码实现如下:
#include
#include
using namespace std;
int selfhold(long number);
int main()
{
long number = 0;
cout << "please enter the number:" << endl;
cin >> number;
if (selfhold(number) == 1)
cout << "yes" << endl;
else
cout << "no" << endl;
return 0;
}
int selfhold(long number) /*判断数number是否是一个自守数*/
{
/**********Program**********/
//先判断number位数,不使用pow()函数
int k = 1, mu = 10;
while (number / mu > 0)
{
k++;
mu *= 10;
}
int n = 0, temp = 0, res = 0;
int mul = 1, mul0 = 1;
for (int q = 0; q < k; q++)
{
mul0 *= 10;
}
for (int i = 0; i < k; i++)
{
mul = 1;//每次都得将mul重置
//mul是为了实现竖式运算过程中,各位数字乘以1,十位上数字需乘以10,以此类推
for (int j = 0; j < i; j++)
{
mul *= 10;
}
//获取number的每位数字
n = number / mul;
n %= 10;
//模拟竖式运算过程
temp = number * n * mul;//对应每一次运算结果
res += temp % mul0;//将每次运算结果影响对应平方结果中number位数的部分相加
}
//每次运算影响部分相加后可能超出number位数,于是取余(res % mul0)
if (res % mul0 == number)
return 1;
else
return 0;
/**********Program**********/
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)