华为机试-HJ99-自守数

题目描述

自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25 ^ 2 = 625,76 ^ 2 = 5776,9376 ^ 2 = 87909376。
请求出n以内的自守数的个数

我的解法

思路:先判位数,再按照位数的相关关系对该数取余

#include 
#include 
using namespace std;

int main()
{
    int n;
    while (cin >> n)
    {
        int count = 0;  // 自守数计数
        for (int i = 0; i <= n; ++i)
        {
            int size = 1;
            for (int j = 1; j <= 10; ++j) // 判断该数有几位,支持十位整数
            {
                if (i < pow(10, j))
                {
                    size = j;
                    break;
                }
            }
            
            if ( int(pow(i, 2)) % int(pow(10, size)) == i )
            {
                count++;
            }
        }
        
        cout << count << endl;
    }
    
    return 0;
}

代码大小:492K
执行速度:4ms

优秀解法

思路:将long类型转为string类型,再用find()进行查找。

#include
#include
#include
using namespace std;
 
int main(){
    long n;
    while(cin>>n){
        int cnt=2;   //0和2也是
        for(long i=2; i<=n; i++){
            long n2=i*i;
            string s1=to_string(i);
            string s2=to_string(n2);
            int pos=s2.size()-s1.size();
            if(s2.find(s1,pos) != -1)
                cnt++;
        }
        cout<<cnt<<endl;
    }
    return 0;
}

代码大小:364K
执行速度:<1ms

你可能感兴趣的:(华为机试练习记录)