📖 题目⭐⭐:
链接:https://ac.nowcoder.com/acm/problem/19841 来源:牛客网
某年某月某天的数学课上,Actci正在遨游宇宙呢,对于他的屡教不改,她的数学老师决定难为一下Actci,将他叫醒。
“咳咳,我现在给出一个数a(0≤a≤
1
0
10000
10^{10000}
1010000,判断a是否是3,5,8,11中某些数的的倍数,你只有一秒钟的时间,答不上来的话,呵,%#W@…”。
作为他后桌的你怎么能看着Actci“受害”呢,于是你决定帮帮他。
💡 思路:
第一眼看到数据,就知道用正常的求余等于0根本无法通过,所以一下想到的是第一种方法:
⌛ plan A: 这个思路是根据3,5,8,11的倍数所拥有的性质来解决:
-
3的倍数:各个位相加能被3整除。
-
5的倍数:结尾为0或5(数字0除外)
-
8的倍数:后三位能够被8整除(不足三位前面补零或者直接除即可)
-
11的倍数:(两个性质选一个就行)
a. 若一个整数的奇位数字之和与偶位数字之和的差能被11整除,则这个数能被11整除。
b.将一个数从个位开始两两分隔,若所有分隔开的数和为11的倍数,则这个数为11的倍数。
⌛ plan B:直接使用BigDecimal类判断能否整除即可,原本以为用BigDecimal这个类装的数据没那么多,没想到能够装这么大的数(颠覆认知观😲!!)
💻 代码A:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String s = input.next();
long sum = 0;
int a[] = new int[4];
int count = 0;
for(int i = 0; i<s.length();i++){
sum+=s.charAt(i)-'0';
}
if(s.equals("0")){
System.out.println("No");
return;
}
if(sum%3==0){
a[count++]=3;
}
if(s.charAt(s.length()-1)=='5'||s.charAt(s.length()-1)=='0'){
a[count++]=5;
}
int temp = 0;
if(s.length()>=3){
temp=Integer.parseInt(s.substring(s.length()-3));
}else{
temp = Integer.parseInt(s);
}
if(temp%8==0){
a[count++]=8;
}
int k,w;
int length = s.length();
if(length%2==0){
k=0;
sum = 0;
}else{
k=1;
sum = Integer.parseInt(s.substring(0,1));
}
for(;k<length;k=k+2){
sum =sum+Integer.parseInt(s.substring(k,k+2));
}
if(sum%11==0){
a[count++]=11;
}
if(count==0){
System.out.println("No");
}else{
System.out.println("Yes");
for(int i = 0;i<count;i++){
System.out.print(a[i]);
if(i!=count-1){
System.out.print(" ");
}
}
}
input.close();
}
}
💻 代码B:
import java.util.*;
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s = input.next();
BigInteger num = new BigInteger(s);
boolean f1 = num.mod(BigInteger.valueOf(3)) == BigInteger.ZERO;
boolean f2 = num.mod(BigInteger.valueOf(5)) == BigInteger.ZERO;
boolean f3 = num.mod(BigInteger.valueOf(8)) == BigInteger.ZERO;
boolean f4 = num.mod(BigInteger.valueOf(11)) == BigInteger.ZERO;
if (f1 || f2 || f3 || f4){
System.out.println("Yes");
}else{
System.out.println("No");
}
if (f1) System.out.print(3 + " ");
if (f2) System.out.print(5 + " ");
if (f3) System.out.print(8 + " ");
if (f4) System.out.print(11 + " ");
input.close();
}
}
📚 总结:
知之甚多,知之甚少。越来越觉得自己有许多东西要慢慢去学习,还是要不断练习,自己才能有点提高。觉得牛客、力扣上的简单题自己都要想好久,对算法的学习之路还是要不断提高,目前连门都没有找到呀!!!!