首先感谢潇会的指正,让我意识到上一解法的缺漏,再次感谢!
题 目如下:
描述
输入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;
}