-
题目
这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数
x
,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s
,表示x
乘以s
是一个光棍,第二个数字n
是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除
x
为止。但难点在于,s
可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。 -
难点解释:
本题的难点在于任何一种数据类型都不可能满足本题需要的数字位数, 例如这里只是一个小小的数字31,但是结果却需要15位的输出,因此, 难点在于如何能够在已有的数据类型中完成本题。 解决办法: 例如本题的13,我们要做的第一步一定是找到第一个比13大的光棍数111, 在得到满足要求的数字8547过程中,其实就是一个111/13的除法过程,因此, 我们可以逐次为 111/13剩下的余数加一位1
-
代码:
#include <iostream> using namespace std; #include<stdio.h> #include <string.h> #include<math.h> #include<stdlib.h> #include<algorithm> int main() { int x; scanf("%d",&x); int da=1,wei=1; while(da<x) { da=da*10+1; wei++; } while(true) { printf("%d",da/x);//就相当于如图所示的第一位8 da=da%x;//得到目前的余数,相当于如图所示的7 if(da==0)break;//能够整除就结束了 da=da*10+1;//相当于如图所示的71 wei++; } printf(" %d\n",wei); return 0; }