求助,为什么20原本是39,我的代码会多几个
查看原帖
求助,为什么20原本是39,我的代码会多几个
804490
qqqqewdwqew楼主2022/11/8 18:41
#include <stdio.h>
int n,a[10]={2,3,4,5,5,5,6,6,6,7},A[10]={1,7,4,2,3,5,6,9,0,8};
int sum=0,cnt=0,an[10],is[200]={0},CNT=0;
//sum 合,cnt计数,an结果可以构成啥,当我选出了可以构成的数  见缝插针(2次)1 2 3 4 5可以插C(2,4)的组合数种来构成1+2=345这种等式在判断是否成立
int key[200][2]={0};//key是记录是否有重复
int check(int x1,int x2){//检查
	for(int i=0;i<CNT;i++){
		if(x1==key[i][0]&&x2==key[i][1]){
			return 0;
		}
	}
	key[CNT][0]=x1,key[CNT][1]=x2;
	return 1;
}
void f(){
	for(int i=1;i<=cnt-1;i++){
		is[i]=1;
		for(int j=i+1;j<=cnt-1;j++){
			if(is[j]==0){
				int sum1=0,sum2=0,sum3=0;
				for(int k=0;k<i;k++){
					sum1=sum1*10+an[k];
				}
				for(int l=i;l<j;l++){
					sum2=sum2*10+an[l];
				}
				for(int m=j;m<cnt;m++){
					sum3=sum3*10+an[m];
				}
				if(sum1+sum2==sum3&&check(sum1,sum2)==1){
//						for(int i=0;i<cnt;i++){
//								printf("%d ",an[i]);
//							}
//							printf("\n");
					printf("%d+%d=%d\n",sum1,sum2,sum3);
					CNT++;
				}
			}
		}
		is[i]=0;
	}
}
void sou(){
	if(sum==n-4&&cnt>=3){
	f();
	}
	else{
		for(int i=0;i<10;i++){
			sum+=a[i];
			an[cnt]=A[i];
			cnt++;
			if(sum<=n-1){
				sou();
			}
			sum-=a[i],cnt--;
		}
	}
}
int main (){
	scanf("%d",&n);
	if(n<10){
		printf("0");
		return 0;
	}
	else{
		sou();
		printf("%d",CNT);
	}
}
2022/11/8 18:41
加载中...