概述

题目如下,很简单,顺着求也行,逆行也行。但是过程采坑无数。。。请看我仔细分析

平方末尾

能够表示为某个整数的平方的数字称为“平方数”
比如,25,64
虽然无法立即说出某个数是平方数,但经常可以断定某个数不是平方数。
因为平方数的末位只可能是:[0, 1, 4, 5, 6, 9] 这6个数字中的某个。
所以,4325435332必然不是平方数。

如果给你一个2位或2位以上的数字,你能根据末位的两位来断定它不是平方数吗?

请计算一下,一个2位以上的平方数的最后两位有多少种可能性?

注意:需要提交的是一个整数,表示2位以上的平方数最后两位的不同情况数。
不要填写任何多余内容(比如,说明解释文字等)

处理

  • 基本思路: 枚举一个可指定范围的数据,取末尾的数字,在取到的范围不在增加的时候,即可得到答案。

下面这种情况在10000是正常的22 当到100000出现问题,原因在于溢出


#include <bits/stdc++.h>

/**
@author:d g w
*/
using namespace std;
typedef long long LL ;

const int maxn=1e5;
set<string> st;
int main()
{
    int ans=0;
    stringstream ss;
    //[0, 1, 4, 5, 6, 9]
    for(int i=10;i<10000;i++){
         int a=i*i;
         ss.clear();
         ss<<a;
         string s;
         ss>>s;
         int len=s.length();
         string p=s.substr(len-2,len);
         st.insert(p);
    }
    cout<<st.size();
    system("pause");
    return 0;
}


  • 第二

在1000正常,10000都不正常。原因:sqrt() 对于浮点数处理,一般情况下应该拿到外面来,或者强制转化,
还有这里用到set ,如果不想用set 直接打表判断也是可以的。。

int main()
{
    stringstream ss;
    //[0, 1, 4, 5, 6, 9]
    for(LL i=1000000; i>15; i--)
    {
        int a=(i)%10;
        if(a==0||a==1||a==4||a==5||a==6||a==9)
        {
              
              if(i==(sqrt(i)*sqrt(i))){  // 单独int x=sqrt(i);即可
                LL b=(i)%100;
                ss.clear();
                ss<<b;
                string s;
                ss>>s;
                st.insert(s);
             }
        }

    }
    cout<<st.size();
    system("pause");
    return 0;
}


  • 手写平方计算。等差数列的,差值为2 的求和公式。


int IsSquare(int n)  
{  
    int i;   
    for(i=1; n>0; i+=2)   
    {  
        n-=i;   
    }  
    if(n==0)  
        return 1;   
    else  
        return 0;  
} 



版权声明:本文为dgwblog原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/dgwblog/p/9017427.html