Sqrt Bo
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1173 Accepted Submission(s): 528
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
题意:给出一个字符串,若开五次根号能开到1,则输出开方次数,否则输出“TAT”。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <string> 6 using namespace std; 7 typedef long long ll; 8 typedef unsigned long long ull; 9 typedef long double ld; 10 11 int main() 12 { 13 char str[1000]; 14 ll i,len; 15 ll n = 0,ans = 0; 16 while(~scanf("%s",str)) 17 { 18 len = strlen(str); 19 if(len>10) 20 { 21 i = 0; 22 } 23 else 24 { 25 i = 1; 26 for(int j = 0; str[j] && j < 11; j++) 27 n = n*10 + str[j]-'0'; 28 //cout << n << endl; 29 while(n != 1) 30 { 31 n = (long long)sqrt((double)n); 32 ans++; 33 if(ans > 5) 34 break; 35 } 36 } 37 n = 0; 38 //cout << i << ' ' << ans << endl; 39 if(i && ans <= 5) 40 cout << ans << endl; 41 else 42 cout << "TAT\n"; 43 ans = 0; 44 i = 0; 45 } 46 return 0; 47 }