【PTA】L1-046 整除光棍(C++)

题目链接:L1-046 整除光棍 - 团体程序设计天梯赛-练习集 (pintia.cn)")

目录:

目录:

题目要求:

输入格式:

输出格式:

输入样例:

输出样例:

思路:

代码:

测试结果:


题目要求:

这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。

提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。

输入格式:

输入在一行中给出一个不以5结尾的正奇数x(<1000)。

输出格式:

在一行中输出相应的最小的sn,其间以1个空格分隔。

输入样例:

31

输出样例:

3584229390681 15

代码长度限制         16 KB

时间限制                400 ms

内存限制                64 MB

思路:

主要功能是寻找一个最小的由多个连续的1组成的数(如11、111、1111等),这个数可以整除给定的整数x。然后输出这个由1组成的数除以x的商,并输出组成这个数的1的个数。

重要变量了解:

**x:**输入的不以5结尾的正奇数

**count:**光棍的位数

**n:**被除数

**n/x:**组成商的每一位

模拟除法图示:

用模拟除法的思路去解决这道题就简单多了,下面我们看图说话

  1. 首先需要得到一个比输入的奇数x大的数(全部由1组成),比如:首先比31大的数是111

  2. 得到第一位组成商的数字:111/31=3

  3. 若是当前被除数不能整除除数,则需要找到下一个被除数,直至能整除就停止寻找

不能整除则留下余数,找下一个被除数:被除数需要增加1个1:比如111%31=18,下一个被除数是1111,则我们需要增加一个1

相当于增加1的效果:余数*10+1,比如18*10+1=181,同时统计一次记录位数的变化

这样即可得到组成商的每一位:余数*10+1/除数,比如181/31=5

头文件和命名空间:

这里包含了<bits/stdc++.h>头文件,它实际上是一个包含了C++标准库中几乎所有头文件的头文件。使用using namespace std;为了避免在代码中重复写std::前缀。

#include <bits/stdc++.h>  
 
using namespace std;

主函数:

程序的入口

int main()
 
{
 
       ....
 
}

定义一个整数x并从标准输入读取它:

int x;  
cin >> x;

初始化n为1(表示当前的由1组成的数,初始时只有一个1),并初始化count为1(表示1的个数):

int n = 1;  
int count = 1;

第一个while循环用于找到第一个可以整除x的由1组成的数:

while(n < x)  
{  
    n = n * 10 + 1; //在n的末尾添加一个1  
    count ++;        //记录1的个数  
}

当找到第一个可以整除x的由1组成的数后,第二个while循环用于输出这个数除以x的商,并更新ncount

while(1)  
{  
    cout << n / x; //输出n除以x的商  
    n = n % x;     //获取n除以x的余数  
    if(n == 0)  
    {  
        break; //如果余数为0,则退出循环  
    }  
    else  
    {  
        n = n * 10 + 1; //否则,在n的末尾添加一个1,并增加1的个数  
        count ++;  
    }  
}
  1. 打印出n除以x的商。
  2. 计算n除以x的余数,并将这个余数赋值回n
  3. 检查n是否为0。如果为0,说明n可以被x整除,此时退出循环。
  4. 如果n不为0,则在n的末尾添加一个1(通过将n乘以10再加上1),并增加count的值。

输出组成这个数的1的个数:

cout << " " << count << endl;

程序结束并返回0:

return 0;  
}

例如,如果输入x为3,输出会是37 3,这意味着最小的由多个连续的1组成的数(即111)可以被3整除,商是37,并且这个数由3个1组成。

代码:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int x;
    cin >> x;
    int n = 1;
    int count = 1;
    while(n < x)
    {
        n = n * 10 + 1; //寻找可以整除x的111...
        count ++;        //记录1的个数
    }
    while(1)
    {
        cout << n / x;
        n = n % x;
        if(n == 0)
        {
            break;
        }
        else
        {
            n = n * 10 + 1;
            count ++;
        }
    }
    cout << " " << count << endl;
    return 0;
}

测试结果:

如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值