题目链接:HDU 5752
题面:
Sqrt Bo
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 592 Accepted Submission(s): 279
Problem Description
Let's define the function
f(n)=⌊n√⌋
.
Bo wanted to know the minimum number y which satisfies fy(n)=1 .
note: f1(n)=f(n),fy(n)=f(fy−1(n))
It is a pity that Bo can only use 1 unit of time to calculate this function each time.
And Bo is impatient, he cannot stand waiting for longer than 5 units of time.
So Bo wants to know if he can solve this problem in 5 units of time.
Bo wanted to know the minimum number y which satisfies fy(n)=1 .
note: f1(n)=f(n),fy(n)=f(fy−1(n))
It is a pity that Bo can only use 1 unit of time to calculate this function each time.
And Bo is impatient, he cannot stand waiting for longer than 5 units of time.
So Bo wants to know if he can solve this problem in 5 units of time.
Input
This problem has multi test cases(no more than
120
).
Each test case contains a non-negative integer n(n<10100) .
Each test case contains a non-negative integer n(n<10100) .
Output
For each test case print a integer - the answer
y
or a string "TAT" - Bo can't solve this problem.
Sample Input
233 233333333333333333333333333333333333333333333333333333333
Sample Output
3 TAT
Source
题意:
给定一个数字,问能否在5次之内(含5次)通过开平方(每次开方后取整)的方式得到1,若可以则输出次数,不可以则输出“TAT”。
解题:
可以算出,临界的边界点为(2^32-1),大于这个数肯定是不行的,若小于这个数,则通过开平方输出次数,大于此数,直接输出“TAT”,如何比较两串大小呢?先比长度,长度相同有再按字典序比较即可。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cmath>
#define LL long long
using namespace std;
string toString(LL x)
{
string res="";
while(x)
{
res+=(x%10+'0');
x/=10;
}
reverse(res.begin(),res.end());
return res;
}
LL toInt(string s)
{
LL res=0,t=1;
for(int i=s.length()-1;i>=0;i--)
{
res+=(s[i]-'0')*t;
t*=10;
}
return res;
}
bool cmp(string a,string b)
{
if(a==b)
return 0;
else if(a.length()>b.length())
return 1;
else if(a.length()==b.length())
return a>b;
else
return 0;
}
int main()
{
int val;
LL t1,t2=1,tmp;
for(int i=0;i<32;i++)
t2*=2;
t2-=1;
string inn,lim;
lim=toString(t2);
while(cin>>inn)
{
if(cmp(inn,lim))
cout<<"TAT\n";
else
{
tmp=toInt(inn);
int cnt=-1;
t2=tmp;
for(int j=1;j<=5;j++)
{
t1=sqrt(1.0*t2);
if(t1==1)
{
cnt=j;
break;
}
t2=t1;
}
if(cnt!=-1)
cout<<cnt<<endl;
else
cout<<"TAT\n";
}
}
return 0;
}