1 条题解
-
0
题意分析
本题是一个关于数字处理和循环检测的问题。核心任务是根据特定规则对输入的六位整数进行一系列操作,直到出现重复数字,从而确定循环相关信息。 基础操作规则:对于给定的六位整数,提取中间四位数字,将其平方后只保留结果的最后六位(若结果不足六位则直接使用)。例如,对于数字 655554,提取中间四位 5555,平方得到 30858025,保留后六位为 858025。
检测目标:持续按照上述规则处理数字,记录每次处理后的结果。当出现与之前记录的结果重复的数字时,说明检测到循环。此时需要确定三个关键信息:循环中第一个出现的数字、循环的长度、从开始到检测到循环总共进行的迭代次数。
特殊情况说明:输入数字不足六位或中间四位数字提取后不足四位时,需补前导零;平方结果不足六位时,直接作为下一个处理的数字。例如数字 200023,中间四位视为 0002;其平方结果 4,保留后仍为 4。同时,程序运行时内存使用不得超过 16MB 。
解题思路
数据存储与初始化:使用字典来存储每个数字首次出现的迭代次数,初始输入的六位整数为第 0 次迭代。定义变量记录当前处理的数字、当前迭代次数、循环起始数字、循环长度和总迭代次数,并进行初始化。
迭代处理过程:进入循环,每次迭代时,先判断当前数字是否已在字典中出现。若未出现,则将其存入字典并记录当前迭代次数;接着按照规则提取中间四位数字,计算平方并保留后六位,得到下一个处理的数字。
循环检测与结果计算:当某个数字在字典中已存在时,说明检测到循环。此时,通过当前迭代次数与该数字首次出现的迭代次数之差,计算出循环长度;将当前重复数字确定为循环中第一个出现的数字;当前迭代次数即为总迭代次数。最后输出循环中第一个出现的数字、循环长度和总迭代次数。
代码
```cpp #include <iostream> #include <cstring> #define MAX 1000001 using namespace std; int a[MAX]; int main() { int n; while(cin>>n) { memset(a,0,sizeof(a)); int sum=0; while(1) { n=n/10; n=n%10000; n=n*n; n=n%1000000; if(a[n]!=0) { sum++; cout<<n<<" "<<sum-a[n]<<" "<<sum<<endl; break; } a[n]=++sum; //cout<<sum<<endl; } } return 0; }
- 1
信息
- ID
- 1184
- 时间
- 1000ms
- 内存
- 64MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者