1.首战自己写:(巨蠢)80分
#include<iostream>
using namespace std;
int tc[10000][3], A_[10000], B_[10000], C_[10000];
int main()
{
int a, b, c, d, e, f, g, h, i = 0 , A, B, C, tmp1, tmp2,tmp3, k, judge[11] = { 0 }, p = 0, q = 0,x=0,cnt[10000],flag=0;
cin >> A >> B >> C;
for (int a = 1; a <= 9; a++)
for (int b = 1; b <= 9; b++)
for (int c = 1; c <= 9; c++)
for (int d = 1; d <= 9; d++)
for (int e = 1; e <= 9; e++)
for (int f = 1; f <= 9; f++)
{
if (a != b && a != c && a != d && a != e && a != f && b != c && b != d && b != e && b != f && c != d && c != e && c != f && d != e && d != f && e != f)
{
tmp1 = a * 100 + b * 10 + c;
tmp2 = d * 100 + e * 10 + f;
if (tmp1*1.0 / A == tmp2*1.0 / B)
{
judge[a] = 1;
judge[b] = 1;
judge[c] = 1;
judge[d] = 1;
judge[e] = 1;
judge[f] = 1;
for (k = 1; k <= 9; k++)
if (judge[k] == 0)
tc[i][q++] = k;
q = 0;
judge[a] = 0;
judge[b] = 0;
judge[c] = 0;
judge[d] = 0;
judge[e] = 0;
judge[f] = 0;
A_[i] = tmp1;
B_[i] = tmp2;
i++;
}
}
}
for (k = 0; k < i; k++)//对每一组A[],B[]找C[]
{
p = 0;
for (g = 0; g < 3; g++)
for (h = 0; h < 3; h++)
for (f = 0; f < 3; f++)
{
if (g != h && g != i && h != i)
{
tmp3 = 100 * tc[k][g] + 10 * tc[k][h] + tc[k][f];
if (tmp3*1.0 / C == A_[k]*1.0 / A)
{
C_[k] = tmp3;
p = 1;
}
}
}
if(p==1)
{
cnt[x++] = k;//把每一个有三个数的组储存下来
flag = 1;
}
}
if (flag == 0)
cout << "No!!!";
else
for (i = 0; i < x; i++)
printf("%d %d %d\n", A_[cnt[i]], B_[cnt[i]], C_[cnt[i]]);
}
2.次战:
思路大致同首战。
1.遍历循环前两个三位数,同时根据比例确定第三个三位数;
2.通过estimate判断i,j,z三个数有没有相同的数字(桶法),无则返回1,然后输出三个数;
区别:
首战是先判断是否有重复数字再找到第三个三位数,找第三个数太过啰嗦;
次战是先找数后判断是否有重复,查重函数是简化的关键;
首战用很多个for枚举每一位的每一个数,
而次战用两个for直接枚举前两个三位数,明显更简洁;
关于查重函数的思考:
如何对三个三位数的每一个数字进行查重:
1.先想如何对一个三位数查重?
桶法;
2.如何一次性查重三个数?
共用一个桶;
3.如何共用?
用for循环3次,每次代表查重一个数;
4.如何代表?
很简单,if语句;
#include <iostream>
using namespace std;
int A, B, C, f[10] = { 0 }, k = 0, d = 0, temp = 0;
bool estimate(int a, int b, int c) {
for (int i = 1; i <= 3; i++) {
if (i == 1) d = a;
if (i == 2) d = b;
if (i == 3) d = c;
while (d)
{
if (!f[d % 10]) {
f[d % 10] = true;
d /= 10;
}
else {
for (int s = 1; s <= 9; s++) f[s] = 0;
return 0;
}
}
}
return 1;
}
int main() {
cin >> A >> B >> C;
for (int i = 123; i <= 340; i++) {
for (int j = i; j <= 999; j++) {
int z = i*1.0 / A * C;
if (i == j*1.0 / B * A)
if (estimate(i, j, z)) {
cout << i << ' ' << j << ' ' << z << endl;
temp++;
}
}
}
if (temp == 0) cout << "No!!!";
return 0;
}