C++自守数(<= 20000)

C++自守数(<= 20000),第1张

题目:求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**********/
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/707141.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存