题解:P11310 无穷的迭代器

· · 题解

前言:

今天的最后一篇题解,肝不动了……

写完就下了各位……

题意分析:

给定一个非负整数 k,我们需要对 r=k+\frac{1}{2} 进行一系列操作,每次操作是找到不小于 r 的最小整数 \lceil r \rceil,然后将 r 乘以 \lceil r \rceil。我们的目标是找出至少需要进行多少次操作才能使 r 变为一个整数。

代码详解:

代码所需的头文件:

#include <cmath>

k=0 时,r=\frac{1}{2},无论进行多少次操作,r 都无法变为整数,因此直接输出 NO!

其他的情况来看,我们可以初始化操作次数为 0,然后进入一个循环,每次循环中进行以下操作:

终止条件:

如果 r 变为整数,则输出操作次数并终止循环;如果操作次数超过某个阈值(理论上应该不会超过),则输出 NO! 并终止。

放上完整代码!!!

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define re return
#define ew 5005
#define sz 10000005
#define sscc cout<<6;
const int MOD=1e9+7;
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T;
    cin>>T;
    while(T--){
        int k;
        cin>>k;
        if(k==0) {
            cout<<"NO!"<<endl;
            continue;
        }
        long double r=k+0.5;
        int sum=0;
        while(true){
            int rr=ceil(r);
            r*=rr;
            sum++;
            if(floor(r)==r){
                cout<<sum<<endl;
                break;
            }
            // 防止无限循环,按道理来说上不应该超过这个值
            if(sum>100) {
                cout<< "NO!"<<endl;
                break;
            }
        }
    }
    re 0;
}

输入部分

首先读取测试数据组数 T,然后进入循环处理每组数据。

特殊部分

k=0 时,直接输出 NO!

循环操作

初始化 rk+0.5,然后进行操作,每次操作后检查 r 是否为整数。

终止条件

如果 r 为整数,则输出操作次数;如果操作次数超过 100 次,则输出 NO!

完结撒花★,°:.☆( ̄▽ ̄)/$.°★。