高手看看怎么样避免重复输出呢?

C语言 码拜 9年前 (2015-11-26) 869次浏览
将一个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分
你只要按顺序分割就可以了
假如分割后,后面的数据比前面的小,那就是重复的,直接剪裁掉,
保证全部分割从小到大排列即可。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明高手看看怎么样避免重复输出呢?
喜欢 (0)
[1034331897@qq.com]
分享 (0)