1.小数据集:
这里表示小于2^31-1的正整数。
2.大数据集:
大于2^31-1的正整数。
3.为何分出大数据集和小数据集:
因为解决小数据集的算法当遇到大数量数据时,往往无法解决
4.何为漂亮数:
输入的数被漂亮数求的余每一位都为1
以下为分别解小数据集和大数据集的java代码:
1.解小数据集
package com.zr.demo;
import java.util.Scanner;
public class BeautifulNumberSmall {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要处理的数据个数,必须为大于0的正整数:");
int cases=scanner.nextInt();
for (int i = 1; i <= cases; i++) {
System.out.println("请输入要处理的数,必须为大于2的正整数:");
long num=scanner.nextLong();
for (long j = 2; j < num; j++) {
long intNum=num;
while (intNum>0) {
if (intNum%j!=1) {
break;
}
intNum/=j;
}
if (intNum<1) {
System.out.println("Beautiful:"+j);
break;
}
}
}
scanner.close();
}
}
2.解小数据集
package com.zr.demo;
import java.util.Scanner;
public class BeautifulNumberLarge {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入要处理的数据个数,必须为大于0的正整数:");
int cases=scanner.nextInt();
for (int i = 1; i <= cases; i++) {
System.out.println("请输入要处理的数,必须为大于2的正整数:");
long num=scanner.nextLong();
System.out.println("Beautiful:"+beautiful(num));
}
scanner.close();
}
private static Long beautiful(long num) {
for (int bits = 64; bits >=2; bits--) {
long minRadix=2;
long maxRadix=num;
while (minRadix<maxRadix) {
long midRadix=minRadix+(maxRadix-minRadix)/2;
long sum=getSum(midRadix,bits);
if (sum==num) {
return midRadix;
}else if (sum>num) {
maxRadix=midRadix;
}else {
minRadix=midRadix+1;
}
}
}
throw new IllegalStateException("Should not reach here.");
}
private static long getSum(long radix, int bits) {
long component=1;
long sum=0;
for (int i = 0; i < bits; i++) {
if (Long.MAX_VALUE - sum < component) {
sum = Long.MAX_VALUE;
return sum;
} else {
sum += component;
}
if (Long.MAX_VALUE / component < radix) {
component = Long.MAX_VALUE;
} else {
component *= radix;
}
}
return sum;
}
}