将一个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分
你只要按顺序分割就可以了
假如分割后,后面的数据比前面的小,那就是重复的,直接剪裁掉,
保证全部分割从小到大排列即可。
假如分割后,后面的数据比前面的小,那就是重复的,直接剪裁掉,
保证全部分割从小到大排列即可。