L1-046 整除光棍 (除法题)C++(g++)极详细,看不懂我吃

先观察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;//输出 空格 与长度 
}

  • 18
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值