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

468

被折叠的 条评论
为什么被折叠?



