详细题目为:输入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*/