改:AL二面之数字结合

首先感谢潇会的指正,让我意识到上一解法的缺漏,再次感谢!

题 目如下:

描述

输入4个10以内的整数,计算总共能组成多少个互不相同且无重复数字的三位数,并计算出它们的总和

输入

包含4个10以内的整数

输出

第一行,包含一个整数,代表能组成的三位数的个数

第二行,包含一个整数,代表这些三位数之和

输入样例 1 

1 2 5 9
输出样例 1

24
11322
 

难点:

(1).输入中可能输入的四个数字中可能存在有相同数字,必须要去掉相同数。

(2).如何对给定的新数组进行不重复的排列,并且去掉首项为零情况。

思路:

首先设两个数组,一个记录最初输入的值,一个作为去重后得到的新数组。

然后再对新数组进行三重循环全排列,得到所有可能的三位数。

接着去掉各个位上可能重复以及首相为零的情况后。

最后输出个数和总数得到结果

详情如下:

#include<stdio.h>
int main()
{
int a[4];  //一个为操作数组,一个为去重后数组
int b[4];
int x;
int sum=0;
int cnt=0;
for(x=0;x<4;x++){
	scanf("%d",&b[x]); //动态赋值
}
int dif=4; //此表示不同的数的个数
int y;
int z;
int c=0;
for(y=0;y<3;y++){   //两重循环做逐一比较
	for(z=1;y+z<4;z++){
	    if(b[y]==10) break;  //如果b[y]==10直接跳过,简化过程同时避免不必要的麻烦
	    if(b[y]==b[y+z]){    //令其为‘10’是防止下轮循环中b[y+z]不再干扰结果
	    	 b[y+z]=10;      //10是两位数,不可能与任何一项相同
	    	 dif--;
	        }
        } 
	if(b[y]!=10) a[c++]=b[y]; //将去重后的数输入新数组
   }
  if(b[3]!=10) a[c]=b[3];  //当不同的数的个数少于3,不能组成各位不重复的三位数
if(dif==1||dif==2||dif==0){   // "||"为或符号
	printf("%d\n%d",cnt ,sum);
}
else{
int i,j,k;
for(i=0;i<dif;i++){  //三重循环对应三位数
	for(j=0;j<dif;j++){
		for(k=0;k<dif;k++){
			if(a[i]!=a[j]&&a[i]!=a[k]&&a[j]!=a[k]&&a[i]!=0){ //去重以及去掉首相为零的情况
				int t;
				t=a[i]*100+a[j]*10+a[k]*1;  //用cnt做记录
				sum+=t;
				cnt++;
		    	}
		    }
	    }
    }
	printf("%d\n%d",cnt,sum);  //输出
}		
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值