【牛客】NC19841 数学(Java)

📖 题目⭐⭐:

链接: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的倍数所拥有的性质来解决:

  1. 3的倍数:各个位相加能被3整除。

  2. 5的倍数:结尾为0或5(数字0除外)

  3. 8的倍数:后三位能够被8整除(不足三位前面补零或者直接除即可)

  4. 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();
    }
}

📚 总结:

知之甚多,知之甚少。越来越觉得自己有许多东西要慢慢去学习,还是要不断练习,自己才能有点提高。觉得牛客、力扣上的简单题自己都要想好久,对算法的学习之路还是要不断提高,目前连门都没有找到呀!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值