团队天梯赛L1-046 整除光棍 (20 分)
一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第22天,点击查看活动详情。
1、题目📑
这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由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
2、思路🧠
方法:
分析题目,可以清楚直到求 x ✖ 某个数 得到的结果result ,result全为1的整数,如果采用暴力的方法,试想一下从数字1开始进行遍历,运算为 10^10 ,基本上是必超时的情况。
所以本题将思路反转 按1 的位数组成的数字 ➗ x,如果可以整数的话,这个数就是所要求的光棍数字,利用StringBuffer的特性来进行模拟每次位数➕1的操作。直到找到合适的光棍数为止。
废话少说~~~~~上代码!
3、代码👨💻
第一次commit AC
import java.math.BigInteger;
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
StringBuffer sb = new StringBuffer();
String str = "1";
BigInteger zero = new BigInteger("0");
for (int i = 0; ; i++) {
str = sb.append("1").toString();
BigInteger bigint = new BigInteger(str);
if (bigint.mod(new BigInteger(String.valueOf(x))).equals(zero)) {
break;
}
}
BigInteger res = new BigInteger(str);
System.out.print(res.divide(new BigInteger(String.valueOf(x))));
System.out.print(" " + str.length());
}
}
4、总结
该题目的是对题目信息的解读,考察阅读能力,以及提出功能,对于功能的实现能力,对字符、字符串api等,以及大数的➕➖✖➗等的操作必须十分熟悉、掌握和使用的熟练程度都会影响做题的时间。
❤️来自专栏《LeetCode基础算法题》欢迎订阅❤️
厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。
对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!