一个整数拆分成多个整数的和,并打印出每一种组合,先列出对就php实现的代码:
function splitdigit($n, $k) { //n是需要拆分的整数,k是指res数组的下标
$rest =0; //存放拆分后剩余的整数
for ($num = 1;$num <= $n; $num++) { //从1开始尝试拆分
if ($num >= $GLOBALS['res'][$k - 1] ) { //拆分的解要大于或等于前一个解保证不重复
$GLOBALS['res'][$k] = $num; //将这次拆分存放在res数组中
$rest = $n - $num; //剩下的是n-num
if ($rest == 0) { //如果没有剩下的,说明本次拆分结束
$GLOBALS['times']++; //拆分次数加1
printf("%3d:", $GLOBALS['times']);
for ($j = 1; $j < $k; $j++) { //输出解
printf("%d+", $GLOBALS['res'][$j]);
}//for
printf("%d<br />", $GLOBALS['res'][$j]);
}//if
else{
splitdigit($rest, $k + 1); //如果有剩下的,继续求出res[k+1]
}
}//if
}//for
}
$res[] =0;
$times =0;
splitdigit(5,1);
echo '=====================================<br />';
$res[] =0;
$times =0;
splitdigit(8,1);
对应的执行结果:
1:1+1+1+1+1
2:1+1+1+2
3:1+1+3
4:1+2+2
5:1+4
6:2+3
7:5
=====================================
1:1+1+1+1+1+1+1+1
2:1+1+1+1+1+1+2
3:1+1+1+1+1+3
4:1+1+1+1+2+2
5:1+1+1+1+4
6:1+1+1+2+3
7:1+1+1+5
8:1+1+2+2+2
9:1+1+2+4
10:1+1+3+3
11:1+1+6
12:1+2+2+3
13:1+2+5
14:1+3+4
15:1+7
16:2+2+2+2
17:2+2+4
18:2+3+3
19:2+6
20:3+5
21:4+4
22:8
算法思想
用一个数组res[]存放拆分的解,用全局变量存放拆分的方法数。splitdigit(n,k)使用n表示要分解的整数,k表示res数组下标,即第k次拆分。先从splitdigit(n,1)开始,用num表示第k个拆分的数,即res[k]=num,让num在[1,n]内遍历。用rest=n-num表示拆分后剩下的整数值。若rest等于零,代表本次拆分结束,输出拆分解。否则处理第k+1个数组元素,即splitdigit(rest,k+1),依次类推,直到rest为0输出结果。
数据结构
splitdigit($n,$k): n表示要分解的整数,k表示res数组下标,即第k次拆分