在编码之前优先条件选择的重要性
题目://用1,2,3……,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3.输出所有解。
我的想法是一个个位数的判断,即优先以各位数不能相等为判断条件,这就导致了我的代码运算量太高,时间过长
代码如下:题目://用1,2,3……,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3.输出所有解。
我的想法是一个个位数的判断,即优先以各位数不能相等为判断条件,这就导致了我的代码运算量太高,时间过长
代码如下:
#include<iostream>
#include<time.h>
using namespace std;
int main()
{
for(int a=1;a<10;a++)
for(int b=1;b<10;b++)
for(int c=1;c<10;c++)
for(int d=1;d<10;d++)
for(int e=1;e<10;e++)
for(int f=1;f<10;f++)
for(int g=1;g<10;g++)
for(int h=1;h<10;h++)
for(int i=1;i<10;i++)
{
if(a==b||a==c||a==d||a==e||a==f||a==g||a==h||a==i||b==c||b==d||b==e||b==f||b==g||b==h||b==i||c==d||c==e||c==f||c==g||c==h||c==i||d==e||d==f||d==g||d==h||d==i||e==f||e==g||e==h||e==i||f==g||f==h||f==i||g==h||g==i||h==i)
continue;
else
{
int s1=a*100+b*10+c;
int s2=d*100+e*10+f;
int s3=g*100+h*10+i;
if(2*s1==s2&&3*s1==s3&&3*s2==2*s3)
cout<<s1<<' '<<s2<<' '<<s3<<endl;
}
}
cout<<(double)clock()/CLOCKS_PER_SEC;
cout<<endl<<(double)clock()/CLOCKS_PER_SEC;
return 0;
}
之后网上查找资料,发现可以以比例(即1:2:3)为优先条件,至于每位数不能相同,则根据他们每位数相加,相乘是定值来判断。(相加必须是45,相乘是362880)
代码如:
#include <stdio.h>
#include<time.h>
void result(int num, int &result_add, int &result_mul)
{
int i, j, k;
i = num / 100; //百位
j = num / 10 % 10; //十位
k = num % 10; //个位
result_add += i + j + k; //分解出来的位数相加
result_mul *= i * j * k; //相乘
}
int main()
{
int i, j, k;
int result_add, result_mul;
for(i = 123; i <=329; i++)
{
j = i * 2;
k = i * 3;
result_add = 0;
result_mul = 1;
result(i, result_add, result_mul);
result(j, result_add, result_mul);
result(k, result_add, result_mul);
if(result_add == 45 && result_mul == 362880)
printf("%d %d %d\n", i, j, k);
}
printf("%f\n",(double)clock()/CLOCKS_PER_SEC);
return 0;
}
自己没有想出来这样做,说明自己的思维还不够灵活,不能够随机转化
上一篇: 用yolov3 VOC训练自己的数据时出现的问题及解决方法
下一篇: 适配器的封装
推荐阅读