数据会出现循环,使用set来处理循环出现的判断就行了,是一道水题
#include <stdio.h>
#include <set>
using namespace std;
int max_num;
int next_num(int num){
long long n = (long long)num;
n *= n;
while(1){
if(n>=0 && n<=max_num)
break;
n /= 10;
}
return (int)n;
}
void func(int bit_n, int init_num){
int cur_num;
max_num = 1;
for(int i=1; i<=bit_n; i++)
max_num *= 10;
max_num--;
int max;
set<int> visited;
visited.clear();
max = init_num;
cur_num = init_num;
visited.insert(cur_num);
while(1){
cur_num = next_num(cur_num);
if(visited.find(cur_num) != visited.end())
break;
visited.insert(cur_num);
if(cur_num > max)
max = cur_num;
}
printf("%d\n", max);
}
int main(void){
int case_n, bit_n, init_num;
//freopen("input.dat", "r", stdin);
scanf("%d", &case_n);
while(case_n--){
scanf("%d %d", &bit_n, &init_num);
func(bit_n, init_num);
}
return 0;
}
用弗洛伊德判圈法可以较大程度提高效率
#include <stdio.h>
#include <set>
using namespace std;
int max_num;
int next_num(int num){
long long n = (long long)num;
n *= n;
while(1){
if(n>=0 && n<=max_num)
break;
n /= 10;
}
return (int)n;
}
void func(int bit_n, int init_num){
int cur_num;
max_num = 1;
for(int i=1; i<=bit_n; i++)
max_num *= 10;
max_num--;
int max, num_slow, num_fast;
max = init_num;
num_slow = num_fast = init_num;
while(1){
num_slow = next_num(num_slow);
if(num_slow > max)
max = num_slow;
num_fast = next_num(num_fast);
if(num_fast > max)
max = num_fast;
num_fast = next_num(num_fast);
if(num_fast > max)
max = num_fast;
if(num_fast == num_slow)
break;
}
printf("%d\n", max);
}
int main(void){
int case_n, bit_n, init_num;
//freopen("input.dat", "r", stdin);
scanf("%d", &case_n);
while(case_n--){
scanf("%d %d", &bit_n, &init_num);
func(bit_n, init_num);
}
return 0;
}