先观察x 与 1.....1 即光棍的关系
首先,我们应该知道,题目中给出了x(31)为例,然后我们继续探究会发现,它们之间存在一个简单的关系,即---31<光棍
31 < 1 NO!
31 < 11 NO!
31 < 111 YES!
发现这个特点后可以为我们初步的节省运算难度.
所以需要以下代码用于检测并增加由1到11到111的过程即↓
while (gg < x) {
gg = gg * 10 + 1;
len++;
}
其中,gg(光棍首拼) 默认是1
len 即长度 每次增加由 11-111 即增加1个长度 固++
====-====
之后,我们初步的算出了在x=31的时候,光棍的初始值应该是111,但是 111没办法整除 31 它们拥有余数 即 111 % 31 = 111-93=18,那么这个余数有什么用???
我们在小学的时候都学过除法,所以我们需要模拟这个过程并控制被除数从111变成1111的过程即可无限推演,请看下面:
算到这里,你可以通过对比案例 31的答案是3584229390681 15
而我们现在算出来的3就是31答案的第一位,那么,这个时候我们就需要把被除数从111 迭代为 1111 来看下图:
请看上图,我们从111变成了111其实只需要把111与31的余数 乘10后 +1 就完事儿了.
为什么加1? 因为我们有规律 是111变成1111 而不是 111变成1110.
所以我们根据上方步骤无限衍生这个1,每次在对len进行++的操作就能顺便算出它的长度.
那么我们时候去结束它? 即 棍子 1...1111 可以被 x(31) 整除 即余数为0的时候结束它.
OK,综上代码如下:请看
#include<iostream>
using namespace std;
int main() {
long long x, gg = 1, len = 1; // 初始化 整数/长棍/长棍长度
cin >> x;
while (gg < x) { //长棍增大到比x大为止 变化为 每次末尾+1 即从1 变成 11 变成 111....
gg = gg * 10 + 1; //辅助公式-从11变成111....
len++;//长度增加
}
while (true) { //代表一直循环知道BREAK
cout << gg / x;// 输出商(这里的结果是整数 往小取整,如果你忘记了为啥要输出它,请看上面的图片会回忆一下.
if (gg % x == 0)break; // 停止条件 上文有讲
gg = gg % x * 10 + 1; // 模拟除法 但 我们不添0 添1 因为要从111 迭代为1111而不是1110
len++;//长度增加
}
cout << " " << len;//输出 空格 与长度
}