#杭电oj 1197 java
特殊的四位数字
查找并列出所有以十进制表示法表示的四位数字,该四位数字具有以下特性:
当以十六进制(以16为基数)表示时,其四位数之和等于其数字总和;
而以十二进制表示时,其四位数也等于其数字的总和(以12为基数的符号。
例如,数字2991的(十进制)数字之和为2 + 9 + 9 + 1 =21。
由于2991 = 1 * 1728 + 8 * 144 + 9 * 12 + 3,其十二进制表示为1893(12),并且这些数字也总计为21。
但是在16进制数2991中,BAF16为11 + 10 + 15 = 36,
因此程序应拒绝2991。
但是,下一个数字(2992)在所有三个表示形式中的总和为22
(包括BB016),因此2992应该在列出的输出上。
(我们不希望使用少于四位数的十进制数字(不包括前导零),
因此2992是第一个正确答案。)
import java.util.*;
public class Main {
public static void main(String[] args) {
for(int i=1000;i<=9999;i++) {//四位数
int ge=i%10;//得到个位
int shi=i%100/10;//得到十位
int bai=i%1000/100;//得到百位
int qian=i/1000;//得到千位
int sum10=ge+shi+bai+qian;//存放十进制各位之和
int sum12=0;//存放12进制各位之和
int sum16=0;//存放16进制各位之和
String i12=Integer.toString(i, 12);//用12进制表示i
char[] arr=i12.toCharArray();//字符串转化成字符数组
for(int j=0;j<arr.length;j++) {
if((arr[j]>=97)&&(arr[j]<=98)) {//a~b:97-98
sum12+=arr[j]-87;
}else {//0~9
sum12+=(arr[j]-48);
}
}
if(sum12==sum10) {//第一次判断,
String i16=Integer.toString(i, 16);//用16进制表示i
char[] arr2=i16.toCharArray();//字符串转化成字符数组
for(int k=0;k<arr2.length;k++) {
if((arr2[k]>=97)&&(arr2[k]<=102)) {//a~f:97-102
sum16+=arr2[k]-87;
}else {//0~9
sum16+=(arr2[k]-48);
}
}
if(sum12==sum16) {//第二次判断
System.out.println(i);
}
}
}
}
}