题目链接: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)。
输出格式:
在一行中输出相应的最小的s
和n
,其间以1个空格分隔。
输入样例:
31
输出样例:
3584229390681 15
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
思路:
主要功能是寻找一个最小的由多个连续的1组成的数(如11、111、1111等),这个数可以整除给定的整数x
。然后输出这个由1组成的数除以x
的商,并输出组成这个数的1的个数。
重要变量了解:
**x:**输入的不以5结尾的正奇数
**count:**光棍的位数
**n:**被除数
**n/x:**组成商的每一位
模拟除法图示:
用模拟除法的思路去解决这道题就简单多了,下面我们看图说话
首先需要得到一个比输入的奇数x大的数(全部由1组成),比如:首先比31大的数是111
得到第一位组成商的数字:111/31=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
的商,并更新n
和count
:
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 ++;
}
}
- 打印出
n
除以x
的商。- 计算
n
除以x
的余数,并将这个余数赋值回n
。- 检查
n
是否为0。如果为0,说明n
可以被x
整除,此时退出循环。- 如果
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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!