Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, with no duplication. Double it we will obtain 246913578, which happens to be another 9-digit number consisting exactly the numbers from 1 to 9, only in a different permutation. Check to see the result if we double it again!
Now you are suppose to check if there are more numbers with this property. That is, double a given number with k digits, you are to tell if the resulting number consists of only a permutation of the digits in the original number.
Input Specification:
Each input file contains one test case. Each case contains one positive integer with no more than 20 digits.
Output Specification:
For each test case, first print in a line “Yes” if doubling the input number gives a number that consists of only a permutation of the digits in the original number, or “No” if not. Then in the next line, print the doubled number.
Sample Input:
1234567899
Sample Output:
Yes
2469135798
1、 可以考虑使用数组存储每个数字,然后比较两个数组是否相等来判断。比较数组的时候,可以先调用排序函数排序后直接比较。
2、 可以使用一个标记数组,数组大小为10,代表0-9十个数字,数组的内容为数字出现的次数,比较两个数组是否相等即可,这样可以免去排序的过程。
PS: 题目中说明输入的字符不超过20位,但是java中 ,最长的long也是有64位,只能表示18位数字,因此这里需要通过字符串来解决输入问题。
import java.util.Arrays;
import java.util.Scanner;
public class Main2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//读入数字并转化为数字数组
Scanner in = new Scanner(System.in);
String numsString = in.nextLine();
char[] numchar = numsString.toCharArray();
int[] num = new int[numchar.length];
for (int i = 0; i < num.length; i++) {
num[i]= Integer.parseInt(String.valueOf(numchar[i]));
}
//标记初始数字的0~9出现的次数
int[] flag = new int[10];
for(int i = 0; i<num.length;i++){
flag[num[i]]++;
}
// for (int i : num) {
// System.out.print(i+" ");
// }
//对数字乘以2
int carry = 0;
int[] num2 = new int[num.length];
for (int i = num.length-1; i >=0; i--) {
int temp = 2*num[i]+carry;
num2[i] = temp%10;
carry = temp/10;
}
//标记翻倍后的数字
int[] flag2 = new int[10];
if(num2.length>2){
for(int i = 0;i<num2.length;i++){
flag2[num2[i]]++;
}
}
//输出结果
if (Arrays.equals(flag, flag2)) {
System.out.println("Yes");
for (int i : num2) {
System.out.print(i);
}
}else {
System.out.println("No");
if (carry!=0) {
System.out.print(carry); //对于某些翻倍后有进位的情况,需要把进位值先输出
}
for (int i : num2) {
System.out.print(i);
}
}
}
}