#include<stdio.h>
#include<time.h>
int main()
{
int a,b,c,d,e,f,g,h,i;
for(a=1;a<10;a++)
for(b=1;b<10;b++)
for(c=1;c<10;c++)
for(d=1;d<10;d++)
for(e=1;e<10;e++)
for(f=1;f<10;f++)
for(g=1;g<10;g++)
for(h=1;h<10;h++)
for(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)
break;
else if((a*100+b*10+c)*2==d*100+e*10+f&&(a*100+b*10+c)*3==g*100+h*10+i)
printf("%d %d %d\n",a*100+b*10+c,d*100+e*10+f,g*100+h*10+i);
else break;
}
printf("Time used=%.21f\n",(double)clock()/CLOCKS_PER_SEC);
return 0;
}
这个是我能想到的程序,但是
理论答案输出:
273 546 819
327 654 981
219 438 657
192 384 576
实际输出:
327 654 981
求大神指教哪里出问题了,还有就是简单方法怎么做,希望步骤能多些注释,谢谢!!
这个是我能想到的程序,但是
这道题以前做过, 有点印象
其实这道题就2个地方要注意, 也是解题关键
abc:def:ghi=1:2:3
1,2,3……,9组成3个三位数abc,def和ghi,每个数字恰好使用一次
对于第一个地方, 我们可以用1个循环, 加3个变量来实现
就是
for(i = 123; i <= 329; i++)i 最小只能是123, 最大只能是329(因为最大数字只能是987)
第2个地方的实现, 我们可以用数学的方法来实现
1~9加起来真能是45, 1~9乘起来只能是362880
所以我们可以将前面的i, j, k分别分解出来的9位数字相加, 相乘,
看最后的结果是不是45,362880
具体代码
//用1,2,3……,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3.输出所有解。效果:
PS:若有不明白的地方, 请追问
追问大神可以帮我看下我的程序哪里出错了吗,谢谢!
问题出在 break;上
以下是可行的实现:
//忽略头以下是更好的实现:主要是利用一个数组实现集合(set)的功能。
//忽略头目前的最佳答案是一个不错的方法,数学支持如下:
1~9加起来真能是45, 1~9乘起来只能是362880
其实应该反过来说
若9个小于10 的正整数的和为45,积为362880,则这9个数是1,2,3...9的一个排列。
调整法可证。
利用遍历,因为组成的数的最小值为123,最大值为789,同时,三个数满足1:2:3的比例关系,因此只需要遍历abc从最小值到最大值即可。
abc最小值为123,因为abc:ghi=1:3,所以abc的最大值为组成三位数的最大值的三分之一,即329。此时只需要遍历abc从123到329即可。
def=abc*2,ghi=abc*3。
这里你需要知道1-9这9个数的和为45,乘积为362880,只需要判断生成的数每一位满足这个条件即可。
具体程序如下(C++):
#include <bits/stdc++.h>