算法竞赛训练指南, 42 页
注意:
1、 用数组来记录一个数的各位的数字
2、 快慢指针来记录链表环的入点(Floyd 判圈算法)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int N, K, Test;
int next(int n, int k)
{
if(0 == k)
{
return 0;
}
int ans = 0;
int buf[100];
long long k2 = (long long)k * k;
int cnt = 0;
while(k2)
{
buf[cnt++] = k2 % 10;
k2 /= 10;
}
if(n > cnt)
{
n = cnt;
}
for(int i = 0; i < n; ++i) //返回高位的 n 位
{
ans = ans * 10 + buf[--cnt];
}
return ans;
}
int main()
{
scanf("%d", &Test);
while(Test--)
{
scanf("%d%d", &N, &K);
int k1 = K, k2 = K;
int ans = K;
do{
k1 = next(N, k1);
k2 = next(N, k2);
ans = max(ans, k2);
k2 = next(N, k2);
ans = max(ans, k2);
}while(k1 != k2);
printf("%d\n", ans);
}
return 0;
}
/*
2
1 6
2 99
*/
/*
9
99
*/