c语言组合问题 4个非负整数相加 = 8 输出所有情况, 注意 0008 和8000 0800 0080这样的算一个,求程序

如题所述

为了不使最后的结果重复,即8+0+0+0=8与0+0+0+8=8重复,不妨设a+b+c+d=8,,其中a<=b<=c<=d.那么结果是从0008一直到2222。2222是最大值,比如1+1+3+3就是1133了,0+1+3+4就是0134,即134了,因为如果出现比2大的数的话,必然会出现0或1才能满足条件。
算法大概是:这4个数组成一个数,从小到大排列,如1133,134(先忽略leading zero,如果以后输出有需要再说)。求出这个数的各位上的数的大小,相加等于8就满足了。
(也可以从大到小排列,即从2222到8000,不过这样循环的次数相对多一些)

#include<stdio.h>
#include<stdlib.h>
#define MIN 8
#define MAX 2222
int main(){
int dig[5],sum,m,n;
bool flag;
dig[0]=0;
for(int i=MIN;i<=MAX;i++){
flag=true;
sum=0,m=1000,n=i; //初始化
for(int j=1;j<=4;j++){
dig[j]=n/m; //dig[]1~4分别记录千、百、十、个位的数字,dig[0]用于比较
if(dig[j]<dig[j-1]){
flag=false;
break;
} //判断是否满足从小到大排列的条件
sum=sum+dig[j]; //计算最后结果,用于最后判断是否等于8
n=n%m; m=m/10;
}
if(!flag) continue; //不满足要求的情况
if(sum==8) printf("%d\n",i); //输出
}
getchar();//按enter结束
return 0;
}
如果要输出这四个数的话,可以输出dig[1~4]数组。
我平时都是用C++写程序的,要是用C++的话,可以
#include<iomanip>
int mian{
if(sum==8) cout<<setw(4)<<setfill('0')<<i<<endl; //输出
}
最后,程序只是我现想的,可能不对,有问题可以追问。另,我是在dev上写的,在别的编译器上也许会出现一些错误,但程序本身是没问题的。
温馨提示:答案为网友推荐,仅供参考
相似回答