首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

填数字的有关问题

2013-10-21 
填数字的问题用1到9这九个数组成等式,〇/〇〇+ 〇/〇〇+〇/〇〇1,每个数字只用一次我只会用笨方法,#include stdio

填数字的问题
用1到9这九个数组成等式,〇/〇〇+ 〇/〇〇+〇/〇〇=1,每个数字只用一次
我只会用笨方法,

#include <stdio.h>
#include <time.h>
int main(int argc, char *argv[])
{
double t1=clock();
int a,b,c,d,e,f,g,h,i;
for (a=1;a<=9;a++)
for (b=1;b<=9;b++)
for (c=1;c<=9;c++)
for (d=1;d<=9;d++)
for (e=1;e<=9;e++)
for (f=1;f<=9;f++)
for (g=1;g<=9;g++)
for (h=1;h<=9;h++)
for (i=1;i<=9;i++)
if (b != a && c != a && c != b && d != a && d != b && d != c && e != a &&
e != b && e != c && e != d && f != a && f != b && f != c && f != d &&
f != e && g != a && g != b && g != c && g != d && g != e && g != f &&
h != a && h != b && h != c && h != d && h != e && h != f && h != g &&
i != a && i != b && i != c && i != d && i != e && i != f && i != g &&
i != h)

if (a/(10.*b+c)+d/(10.*e+f)+g/(10.*h+i)==1)
printf("%d %d %d %d %d %d %d %d %d\n", a,b,c,d,e,f,g,h,i);
printf("%fs\n", (clock()-t1)/1000);
return 0;
}

[解决办法]
我只是随便看一眼 要是我的话 我会观察
x + y + z = 1
那么也就是说 x小于1 y小于1 z小于1
这样会快些了多
还有当前俩个大于1的时候 也不满足
最后也是最重要的一点就是 你会发现最后竟然是等于1
而且他们都是几十分之几 竟然最后能通分等于1
你把他们分母统一一下 你会发现原来也不是很难 分子等于分母
[解决办法]
我这也是个笨办法
观察一下
a/(bc) +d/(ef) +g/(hi) =1
其中:
bc = b*10+c
ef = e*10 + f
hi = h*10+i
于是:
a/(bc) +d/(ef) +g/(hi) =1
<==>
a*ef *hi +d *bc*hi + g* bc * ef = bc*ef*hi 

先求组合,然后对每一个组合,检查 a*ef *hi +d *bc*hi + g* bc * ef == bc*ef*hi 是否成立

这里都是整数计算 2位*2位*2 位, 结果是6位数 ,不超过 32Bits.



[解决办法]
全排列

[解决办法]
2楼基本正解。。。
按2楼思路写了个小程序,竟然唯一解(去除交换律)

#include <stdio.h>
#include <algorithm>
#include <functional>
using namespace std ;

int main()
{
int a[] = {1,2,3,4,5,6,7,8,9};
do
{
int ef = a[4]*10+a[5];
int bc =a[1]*10+a[2];
int hi =a[7]*10+a[8];
if (a[0]*ef*hi+a[3]*bc*hi+a[6]*bc * ef ==bc*ef*hi )
{
printf("%d/%d+%d/%d+%d/%d=1\n",a[0],bc,a[3],ef,a[6],hi);
}
}while (next_permutation(a,a+9));
getchar();
return 0;
}

热点排行