1. 整数拆分问题
一个整数总可以拆分为2的幂的和,例如:
7=1+2+4
7=1+2+2+2
7=1+1+1+4
7=1+1+1+2+2
7=1+1+1+1+1+2
7=1+1+1+1+1+1+1
统共有六种不合的拆分体式格式。
1. 题目解答
题目分析
对于奇数n=2k+1:它的拆分的第一项必然是1,推敲去掉这个1,其实就一一对应于 2k的拆分,是以f(2k+1)=f(2k)
对于偶数n=2k:推敲有1和没有1的拆分。有1的拆分,与(2k-1)的拆分一一对应,与上方奇数的景象来由雷同;没有1的拆分,将每项除以2,正好一一对应于k的所有拆分。是以f(2k)=f(2k-1)+f(k)
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
while(s.hasNextInt()) {
int n = s.nextInt();
int[] f = new int[1000001];
f[1] = 1;
for(int i = 2; i <= n; i++) {
if(i % 2 == 0) {
f[i] = (f[i-1] + f[i/2]) % 1000000000;
}else {
f[i] = f[i-1];
}
}
System.out.println(f[n]);
}
}
2. 大数相加
public static String bigNumberAdd(String a, String b) {
if(a == null || b == null || a.equals("") || b.equals(""))
return null;
StringBuilder result = new StringBuilder();
//反转
StringBuilder sbA = new StringBuilder(a).reverse();
StringBuilder sbB = new StringBuilder(b).reverse();
int lenA = sbA.length();
int lenB = sbB.length();
int maxLen = lenA > lenB ? lenA : lenB;
boolean overflow = false;
int nTakeOver = 0;
//高位补零
if(lenA < lenB) {
for(int i = lenA; i < maxLen; i++) {
sbA.append("0");
}
}else if(lenA > lenB) {
for(int i = lenB; i < maxLen; i++) {
sbB.append("0");
}
}
System.out.println(sbA.toString());
System.out.println(sbB.toString());
for(int i = 0; i < maxLen; i++) {
//加进位
int nSum = Integer.parseInt(sbA.charAt(i)+"") + Integer.parseInt(sbB.charAt(i)+"") + nTakeOver;
if(nSum >= 10) {
if(i == (maxLen-1)){
overflow = true;
}
nTakeOver = 1;
result.append(nSum-10);
}else {
nTakeOver = 0;
result.append(nSum);
}
}
if(overflow) {
result.append(nTakeOver);
}
return result.reverse().toString();
}
3. 整数排序
实现输入一组大于零的整数,根据从小大数排序,排序后有连续数时,只输出最小和最大的数
输入: 1, 4, 3, 110, 2, 90, 7
输出: 1 4 7 90 110
//相等也算连续
public static void sortInteger(int[] arr) {
if(arr == null || arr.length == 0)
return;
Arrays.sort(arr);
int len = arr.length;
int min = 0, max = 0;
for(int i = 0; i < len; i++) {
min = max = arr[i];
System.out.print(min + " ");
if(i == (len-1))
break;
while((arr[i+1] - 1) == arr[i] || arr[i+1] == arr[i]) {
i++;
max = arr[i];
if(i == (len-1))
break;
}
if(min != max)
System.out.print(max + " ");
}
}