PAT甲级1023 Have Fun with Numbers

本文介绍了解决PAT甲级1023题目的方法,题目要求判断一个不超过20位的大整数乘以2后位数是否变化。核心在于使用字符串和字符数组进行大整数相加,通过逐位处理和进位计算,最终比较原数和加倍后的位数。

PAT 甲级 1023 Have Fun with Numbers

题目概述:给一个不超过20个数字的大正整数,求出这个数2倍之后的结果和原结果相比,如果数字个数发生了改变,输出yes,否则no

整道题的核心就是考一个字符串进行大整数相加的问题,因为这个不超过20个数字的大整数已经超过long的范围了,必须使用字符串和字符数组进行相加

package higherlevel;

import java.util.Scanner;

public class I023 {
    public static void main(String[] args) {
        Scanner s=new Scanner(System.in);
        int[] orginal={0,0,0,0,0,0,0,0,0,0};        //记录初始字符串每个数字的个数
        char[] c1=s.nextLine().toCharArray();
        for(int i=0;i<c1.length;i++){
            switch (c1[i]-48){
                case 0:orginal[0]++;break;
                case 1:orginal[1]++;break;
                case 2:orginal[2]++;break;
                case 3:orginal[3]++;break;
                case 4:orginal[4]++;break;
                case 5:orginal[5]++;break;
                case 6:orginal[6]++;break;
                case 7:orginal[7]++;break;
                case 8:orginal[8]++;break;
                case 9:orginal[9]++;break;
            }
        }
        //大整数的字符串相加法,这是整道题的核心部分
        String str="";
        int carry=0;
        for(int i=c1.length-1;i>=0;i--){
            int a=2*(c1[i]-48)+carry;
            if(a>=10){
                carry=1;
                str=str+(a-10);
            }else{
                carry=0;
                str=str+a;
            }
        }                   //这里得到的str字符串是结果的倒序,因为是从个位开始加的
        if(carry!=0){
            str=str+carry; //因为结果是倒序的,所以最后的进位carry放后边
        }
        char[] c2=str.toCharArray();
        int[] result={0,0,0,0,0,0,0,0,0,0}; //  记录相加得到的结果中每个数字的个数
        for(int i=0;i<c2.length;i++){
            switch (c2[i]-48){
                case 0:result[0]++;break;
                case 1:result[1]++;break;
                case 2:result[2]++;break;
                case 3:result[3]++;break;
                case 4:result[4]++;break;
                case 5:result[5]++;break;
                case 6:result[6]++;break;
                case 7:result[7]++;break;
                case 8:result[8]++;break;
                case 9:result[9]++;break;
            }
        }
        boolean flag=true;
        for(int i=0;i<10;i++){      //如果之前数字的个数和之后数字的个数有不一样的
            if(orginal[i]!=result[i]){      //输出NO,全一样才输出YES
                flag=false;
                break;
            }
        }
        if(flag==true){
            System.out.println("Yes");
            for(int i=c2.length-1;i>=0;i--){
                System.out.print(c2[i]);
            }
        }else{
            System.out.println("No");
            for(int i=c2.length-1;i>=0;i--){
                System.out.print(c2[i]);
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥肥旭手记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值