1.题目链接。题目大意:给定一个数据,判断是否可以在五次内开方把它变成1,开方的时候取下整。倒着推回去,取下整开方是1的数据是1-3,再开方是4-7.。。其实这个规律十分的明显,倒着推回去就是2的k次方到pow(2,k+1)-1这个区间的数据开方取下整都是一个数,推回去之后,临界数据就是pow(2,32)-1。大于它的都是不行的,小于它的都是可以的。输入采用字符串,然后就OK。下面是AC代码:
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
#define ll long long
ll trans(string s)
{
ll tem = 0;
int len = s.size();
for (int i = 0; i < s.size(); i++)
{
tem += (s[i] - '0')*pow(10, len - i - 1);
}
return tem;
}
int main()
{
string s;
while (cin >> s)
{
if (s.size() >= 11)
{
puts("TAT");
}
else
{
int cnt = 0;
ll tem = trans(s);
if (tem > 4294967295)
{
puts("TAT");
}
else
{
if (tem == 1)
{
puts("1");
}
else if (tem == 0)
{
puts("TAT");
}
else
{
while (tem > 1)
{
tem = (int)sqrt(tem);
cnt++;
}
printf("%d\n", cnt);
}
}
}
}
return 0;
}