题目要求:
这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由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:组成商的每一位
模拟除法图示:
用模拟除法的思路去解决这道题就简单多了,下面我们看图说话
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的商,并更新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; }
测试结果: