Sqrt Bo
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2438 Accepted Submission(s): 806
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
容易想到临界值就是2^32开5次方之后是2.只要大于等于这个数就完成不了。
之后就直接循环开根就可以。
特别注意0!!!!!卡了好久QAQ TAT
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
char s[10000];
int i;
long long hh=65536*65536;
while(~scanf("%s",s))
{
int len=strlen(s);
if(len>10)
{
printf("TAT\n");
continue;
}
else
{
long long h=0;
for(i=0;s[i]!='\0';i++)
{
h=h*10+(s[i]-'0');
}
if(h==0)
{
printf("TAT\n");
continue;
}
for(i=0;i<10;i++)
{
h=sqrt(h);
if(h==1)
break;
}
if(i<5)
printf("%d\n",i+1);
else
printf("TAT\n");
}
memset(s,'\0',sizeof(s));
}
return 0;
}