题目——数字组合

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

解析:在数学题中,这是个简单的排列组合问题,而在c语言程序当中,需要我们遍历整个数组,枚举出所有可能的情况,并且按照题目的限制条件来进行选择。

step1:枚举出所有情况(计算机最擅长的)

    int a[20];
    int num=4;
    //scanf_s("%d", &num);
    for(int i=0;i<num;i++){
        scanf_s("%d", &a[i]);
    }
    int sum;
    int b, s, g;//三个循环的循环条件变量
    for (b = 0; b < 4; b++) {  //这三个for循环来将所有的可能列出,无脑组合,然后再添加限制条件。
        for (s = 0; s < 4; s++) {
            for (g = 0; g < 4; g++) {
                int q = a[b];
                int w = a[s];
                int e = a[g];
                sum = (q * 100) + (w * 10) + e;

/*第一个for定百位,第二个for定十位,第三个for定个位,个位循循环完后,改变十位,个位继续循环,十位循环完后,改变百位,十位改变,个位也改变,直到百位循环结束*/
            }
        }
    }

step2:设立条件1——不重复

sum = (q * 100) + (w * 10) + e;

if (b != s && b != g && s != g&& a[b]!= a[s]&& a[b]!= a[g]&& a[s]!= a[g]) {
        printf("%d ", sum);
}

/*这个if判断语句直接使得三位数各个不相同才能输出*/

step3:设立条件2——有零的情况应该分类出来

(可能会有人分几个if的情况来分别列出零的情况,但我觉得,有零的情况需要排除的就是百位,只要让这个三位数一直保持大于100的情况就能排除零在百位的情况,当然,零要投入运算当中才可以)

sum = (q * 100) + (w * 10) + e;
if (b != s && b != g && s != g&&sum>100) {
        printf("%d ", sum);
}

 (以上的例子只能做到把每个数列出来,那既然都这样,题目的要求(计算总共能组成多少个互不相同且无重复数字三位数,并计算出它们的总和)还难吗哈哈哈。)

需要int count=0;来计算循环了多少次,即为组成复合条件的三位数。

需要用个变量all_sum来将每次循环成功的sum相加起来。

所以完整的程序如下:

#include<stdio.h>
int main()
{
	int a[20];
	int num=4;
	//scanf_s("%d", &num);
	for(int i=0;i<num;i++){
		scanf_s("%d", &a[i]);
	}
	int sum;
	int b, s, g;//三个循环的循环条件变量
	int count = 0;//计算总共循环了多少遍,既有几个数
	int all_sum=0;
	for (b = 0; b < 4; b++) {  //这三个for循环来将所有的可能列出,无脑组合,然后再添加限制条件。
		for (s = 0; s < 4; s++) {
			for (g = 0; g < 4; g++) {
				int q = a[b];
				int w = a[s];
				int e = a[g];
				sum = (q * 100) + (w * 10) + e;
				if (b != s && b != g && s != g&&sum>100) {
					printf("%d ", sum);
					count++;
					all_sum += sum;
				}
			}
		}
	}
	printf("\n%d", count);
	printf("\n%d", all_sum);
	return 0;
}

(这个完整程序只能,用于四个不相同的数字,他们按照这个排列顺序是不会出现重复的,但当我们输入了有重复数字的,就要再从这个数组当中排除出重复的数字组合了。)

step4:排除重复读取重复数字的情况(将上述三步处理好的数字导入box[]数组中,然后再用指针来指向数组进行遍历检查)

#include<stdio.h>
int main()
{
	int a[20];
	int box[40];
	int num=4;
	//scanf_s("%d", &num);
	for(int i=0;i<num;i++){
		scanf_s("%d", &a[i]);
	}
	int sum;
	int b, s, g;//三个循环的循环条件变量
	int count = 0;//计算总共循环了多少遍,既有几个数
	int all_sum=0;
	int i = 0;
	for (b = 0; b < 4; b++) {  //这三个for循环来将所有的可能列出,无脑组合,然后再添加限制条件。
		for (s = 0; s < 4; s++) {
			for (g = 0; g < 4; g++) {
				int q = a[b];
				int w = a[s];
				int e = a[g];
				sum = (q * 100) + (w * 10) + e;
				if (b != s && b != g && s != g && sum >= 100&& a[b]!= a[s]&& a[b]!= a[g]&& a[s]!= a[g]) {
					box[i] = sum;
					i++;
				}
			}
		}
	}
	int* p = box;
	int* q = box;
	int pd = 0;
	for (int n = 0; n < i; n++) {
		for (int m = 1; m < i; m++) {
			if (*(p + n) == *(q+n+m)) {
				pd = 0;
				break;
			}
			else {
				pd = 1;
			}
		}
		if (pd == 1) {
			count++;
			printf("%d ", *(p+n));
			all_sum += *(p+n);
		}
	}
	printf("\n总数为%d", count);
	printf("\n总和为%d", all_sum);
	return 0;
}
/*输入1 2 5 9
输出125 129 152 159 192 195 215 219 251 259 291 295 512 519 521 529 591 592 912 915 921 925 951 952
总数为24
总和为11322

输入1 2 2 4
输出124 142 214 241 412 421
总数为6
总和为1554*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值