算法中处理平方数的坑
概述
题目如下,很简单,顺着求也行,逆行也行。但是过程采坑无数。。。请看我仔细分析
平方末尾
能够表示为某个整数的平方的数字称为“平方数”
比如,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;
}