整数拆分 算法。

来源:互联网 发布:kindle怎么下软件 编辑:程序博客网 时间:2024/05/29 21:18

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>


#include "stdio.h"


#define N 8


main(){
int i,j,s,sum;
    int a[N];
    int x;
long k=0;
x=2;
printf("%d=%d",N,N);   //把独物的一种情况独立展示出来
//穷举法 计算
while(1){
k++;                  //通过K统计N个数组成的个数
if(k==s*N) break;     //k超过统计的个数退出循环
s=1;                  //S来计算对应位的权
a[0]=k%N;             //第1位的值
sum=a[0];             //通过sum累加,后面要与N做比较
if(a[0]==0) continue; //凡是位数上有0的跳过
for(i=1;i<N-1;i++)    //通过循环第k种情况个其他位置的值应当是多少
{s*=N;                //统计对应的权
a[i]=k/s%N;          //计算第i位置的值
if(a[i]==0) break;   //凡是位数上有0的跳过,注break这里是直接结束for循环进入while
     sum+=a[i];           //累计a[i]的和
if (sum>N) continue; //如果累计的值超过N不必再继续后面。
if (i==x) x++;       //x代表通计数字组成的个数且只能累增,后面少于组成个数就可以被筛选掉
                        // 如果组成的个数开始累增1了,x就做一下标识
if (i+1<x) continue; // 如果组成个数小于当前x则不必再继续后面。
if (sum==N) {        //如果sum与N一直,则输出结果
    printf("=");
for(j=0;j<i;j++)
         printf("%d+",a[j]);
         printf("%d",a[j]);
}
}
}
printf("=");  //独特的另一种情况展示出来
for(i=0;i<N-1;i++) 
printf("1+");
printf("1\n");
}
0 0
原创粉丝点击