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
3TAT
分析:判断一个数开根号几次之后等于1,次数不超过5次,有则输出次数,否则输出TAT
AC代码如下:
#include"stdio.h" #include"string.h" #include"math.h" int main() { char a[110]; long long sum; while (scanf("%s",a)!=EOF) { sum=0; int s=strlen(a); if (s>=11)//4294967296连续开方,开5次之后等于2,该数为上限,只有10位,故大于11位的,输出TAT { printf("TAT\n"); continue; } for (int i=0;i<s;i++) { sum+=(a[i]-48)*pow(10,s-1-i); } if (sum>=4294967296||sum==0)//4294967296连续开方,开5次之后等于2,如果该数所用次数大于5,或者该数为0 { printf("TAT\n"); continue; } int count=0; while (sum>1) { count++; sum=sqrt(sum); } printf("%d\n",count); } return 0; }