题目解析:
这是一道模拟题
最容易想到的就是直接暴力求解,但是由于需要计算的数据范围超过了长整型(long long ),因此如果暴力求解,只能拿到部分分数。
我们可以换个思路:
既然是求判断一个数是否能够整除,容易想到的是求公因子,由于题目要求除数是一个质数(11 111 11111...等),所以该方法行不通。
我们还能想到,平时我们用除法运算的时候,我们是一部分一部分地相除,无论多大的数,都可以按照规则运算。大家可以对照一下下面的规则:
整数的除法法则
1)从被除数的高位起,先看除数有几位,再用除数试除被除数的前几位,如果它比除数小,再试除多一位数;
2)除到被除数的哪一位,就在那一位上面写上商;
3)每次除后余下的数必须比除数小。
除数是整数的小数除法法则:
1)按照整数除法的法则去除,商的小数点要和被除数的小数点对齐;
2)如果除到被除数的末尾仍有余数,就在余数后面补零,再继续除。
看到这是不是已经有点思路了呢?
为了直观形象,这里就拿输入样例给大家举个例
首先我们需要找到所谓的光棍数,要满足除法运算规则,首先要满足被除数大于除数。所以我们就要从输入的数据开始,找到第一个比输入数据大的光棍,样例输入31,所以我们找到的第一个比3大的光棍就是111了。
接下来我们就从 111 开始与31相除,得到 3
余数为 18,按照除法规则,被除数小于除数,要在余数后面再加上一位相除。即变成181,在与31相除,得到 5 余数为 26,在加上一位变成 261 再与 31 相除…以此类推,直到余数为零退出计算。
代码实现:
代码测试:
样例
自己输入一个最大的数据,没有超时。
可以看到,运行时间只有4ms,时间复杂度为常数级。
网站声明:文章内容来源于网络,本站不拥有所有权,请认真核实,谨慎使用,本站不承担相关法律责任。