1 条题解

  • 0
    @ 2025-7-4 20:53:40

    JAVA题解:

    import java.io.*;
    import java.math.BigInteger;
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String s = br.readLine().trim();
            String[] parts = br.readLine().trim().split(" ");
            int a = Integer.parseInt(parts[0]);
            int b = Integer.parseInt(parts[1]);
            
            solve(s, a, b);
        }
        
        public static void solve(String s, int a, int b) {
            int n = s.length();
            
            // 计算前缀余数 pref[i] = s[:i] mod a
            int[] pref = new int[n + 1];
            for (int i = 1; i <= n; i++) {
                pref[i] = (pref[i - 1] * 10 + (s.charAt(i - 1) - '0')) % a;
            }
            
            // 计算后缀余数 suf[i] = s[i:] mod b
            int[] suf = new int[n + 1];
            long p = 1; // 当前位权
            for (int i = n - 1; i >= 0; i--) {
                suf[i] = (int)((s.charAt(i) - '0') * p + suf[i + 1]) % b;
                p = (p * 10) % b;
            }
            
            // 从右向左枚举切割点,找到第一个满足条件的切割点
            for (int i = n - 1; i > 0; i--) {
                // 后半部分不能有前导零
                if (s.charAt(i) == '0') {
                    continue;
                }
                
                // 检查两部分是否分别能被a和b整除
                if (pref[i] == 0 && suf[i] == 0) {
                    System.out.println("YES");
                    System.out.println(s.substring(0, i));
                    System.out.println(s.substring(i));
                    return;
                }
            }
            
            // 没有找到合适的切割点
            System.out.println("NO");
        }
        
        // 用于处理大整数的辅助方法
        public static String[] solveWithBigInteger(String s, int a, int b) {
            int n = s.length();
            
            // 从右向左枚举切割点
            for (int i = n - 1; i > 0; i--) {
                // 后半部分不能有前导零
                if (s.charAt(i) == '0') {
                    continue;
                }
                
                String left = s.substring(0, i);
                String right = s.substring(i);
                
                BigInteger leftNum = new BigInteger(left);
                BigInteger rightNum = new BigInteger(right);
                
                if (leftNum.mod(BigInteger.valueOf(a)).equals(BigInteger.ZERO) &&
                    rightNum.mod(BigInteger.valueOf(b)).equals(BigInteger.ZERO)) {
                    return new String[]{"YES", left, right};
                }
            }
            
            return new String[]{"NO"};
        }
    }
    
    
    • 1

    25年6月-华为实习(留学生)-1.数组切割

    信息

    ID
    29
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    2
    已通过
    1
    上传者