将一个10以内的数分解为正整数相加,输出全部情况。如5: 5=1+4 5=2+3 5=1+1+3 ……
本人的代码如下
本人的代码如下
#include <stdio.h>
char result[20];
int N = 0;
void solve(int c, int t, int l, int d)
{
int i = 1;
if(d == l)
{
result[ (l - 1) * 2 ] = ""+"";
result[ (l - 1) * 2 + 1] = ""0"" + N - t;
for(i = 1; i < 20 ; i++)
{
printf("%c",result[i]);
}
printf("\n");
}
else
{
for(i = c;i + t < N ;i++)
{
result[(l - 1) * 2] = ""+"";
result[(l - 1) * 2 + 1] = ""0"" + i;
solve(i, t + i, l + 1,d);
}
}
}
void reset()
{
int i = 0;
for(; i < 20; i++)
{
result[i] = ""\0"";
}
}
int main()
{
int i = 0;
N = 10;
printf("input number\n");
scanf("%d", &N);
printf("\n");
for(i = 2; i <= N; i++)
{
reset();
solve(1,0,1,i);
}
return 0;
}
5=2+3和5=3+2应该是一种情形,怎么样避免重复输出呢?
解决方案:30分
实现该算法的是时候加上一个条件:后一个数不能小于前一个数
解决方案:20分
仅供参考:
#include <stdio.h>
#include <stdlib.h>
void print(int res[], int num) {
static int L=0;
L++;
printf("%8d:",L);
for (int i=0;i<num;++i) {
printf(" %d", res[i]);
}
printf("\n");
}
void split(int n, int m) {// n表示总数,m表示最大因子
static int res[100];// 保存结果
static int num=-1;// 当前因子下标
if (n<m || n<0 || m<1) return;
num++;
if (0==n) {// 递归终止条件,为0不可再分,直接输出
print(res,num+1);
num--;
return;
} else {
if (n==m) {// 不拆,直接输出
res[num]=m;
print(res,num+1);
num--;
} else {
// 拆分出第一个
res[num]=m;
n=n-m;
if (m>n) m = n; // 最大因子不可能大于总数
for (int i=m;i>=1;--i) {// 循环,第二个因子可以继续拆分,而且按照最大因子不同可以拆分成多个
split(n,i);
}
num--;
}
}
}
void Split(int n) {
if (n<=0) return;
if (100<n) {
printf("Up to 100\n");
return;
}
for (int i=n;i>=1;--i) {
split(n, i);
}
}
void main(int argc,char **argv) {
if (argc<=1) Split(5);
else if (argc>=3) split(atoi(argv[1]),atoi(argv[2]));
else Split(atoi(argv[1]));
}
解决方案:10分
你只要按顺序分割就可以了
假如分割后,后面的数据比前面的小,那就是重复的,直接剪裁掉,
保证全部分割从小到大排列即可。
假如分割后,后面的数据比前面的小,那就是重复的,直接剪裁掉,
保证全部分割从小到大排列即可。