力扣三连击---c/c++解法
题目:将 1,2,…,9 共 9 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 9:3:6,试求出所有满足条件的三个三位数。
解法一:(个人觉得是很实用,运用的盒子来解决)
#include<stdio.h>
int main() {
int a, b, c;
int ge, shi, bai;
for (a = 123; a <= 333; a++) {
int flag = 1;
//引用盒子,判断每个数据的使用情况,这里第一位0赋值为0, 因为数据从零开始!!!
int w[10] = {0, 1, 1, 1, 1, 1, 1, 1, 1, 1};
ge = a % 10;
shi = a / 10 % 10;
bai = a / 100;
if (ge != shi && shi != bai && bai != ge)
flag++;
if (w[ge]*w[shi]*w[bai] != 0)
flag++;
w[ge] = 0, w[shi] = 0, w[bai] = 0;
b = 2 * a;
ge = b % 10;
shi = b / 10 % 10;
bai = b / 100;
if (ge != shi && shi != bai && bai != ge)
flag++;
if (w[ge]*w[shi]*w[bai] != 0)
flag++;
w[ge] = 0, w[shi] = 0, w[bai] = 0;
c = 3 * a;
ge = c % 10;
shi = c / 10 % 10;
bai = c / 100;
if (ge != shi && shi != bai && bai != ge)
flag++;
if (w[ge]*w[shi]*w[bai] != 0)
flag++;
w[ge] = 0, w[shi] = 0, w[bai] = 0;
//7种条件全部满足 输出即可!!!
if (flag == 7) printf("%d %d %d\n", c, a, b);
}
return 0;
}
//576 192 384
//657 219 438
//819 273 546
//981 327 654
解法二:
/*
1、按照a:b:c=1:2:3的比例穷举所有数
2、将a,b,c的百位、十位、个位分别拆分储存到整形数组s[9]中;
3、判断数组s[9]有无重复数字、是否有数字0
4、输出结果
*/
#include <stdio.h>
int main()
{
int a, b, c; //令三个数分别为a:b:c
int i, j, s[9];
for (a = 100; a < 333; a++) //数值不能重复
{
b = 2 * a, c = 3 * a; //计算b、c的值
s[0] = a / 100; s[1] = a % 100 / 10; s[2] = a % 10; //分离a的百位、十位、个位。下同
s[3] = b / 100; s[4] = b % 100 / 10; s[5] = b % 10;
s[6] = c / 100; s[7] = c % 100 / 10; s[8] = c % 10;
for (i = 0; i < 8; i++) //判断是否有重复数字(前一个数字和后面所有数字比较,如第1个和第2个至9个比较)、是否有数字0
{
for (j = i + 1; j < 9; j++)
if (s[i] == s[j]||s[i]==0||s[j]==0)break;
if (j < 9) break;
}
if (i == 8 && j == 9) //无重复数字、也无0
printf("a=%d,b=%d,c=%d\n", a, b, c);
}
return 0;
}
测试结果: