题目链接:
http://poj.org/problem?id=2183
题目大意:
给定一个六位数,选择中间四位数字,求它的平方,只保留后六位数字。然后再选择新六位数字中间
的四位数字,求这四位数字的平方,再只保留后六位数字。这样循环下去,直到出现重复的六位数字
为止。输出第一次出现循环的六位数字,循环长度和循环前总共执行的操作步数。
思路:
直接模拟就可以了,用一个大于1000000的数组来存储六位数字,初始化为-1,出现六位数字,就将
相应位置执行的操作次数,只要在相应位置上找到大于等于0的,就说明之前已经出现过了,然后输出
结果。
AC代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; int vis[1000010]; int main() { int n; while(cin >> n) { memset(vis,-1,sizeof(vis)); int i; vis[n] = 0; for(i = 1; ; ++i) { n = n/10%10000; n *= n; n %= 1000000; if(vis[n] >= 0) break; vis[n] = i; } cout << n << ' ' << i-vis[n] << ' ' << i << endl; } return 0; }
POJ2183 Bovine Math Geniuses【伪随机数】
原文:http://blog.csdn.net/lianai911/article/details/44679227