魔方吧·中文魔方俱乐部

标题: 数学高手编程高手进 [打印本页]

作者: Osullivan    时间: 2009-6-1 09:01:35     标题: 数学高手编程高手进

1--9填入方格,数字不准重负,使等式成立
附件2为这题做的FLASH,可以下下来做这道题~~~~~~~~~~~~

附件: 1-9.jpg (2009-6-1 09:01:35, 4.5 KB) / 下载次数 38
http://bbs.mf8-china.com/forum.php?mod=attachment&aid=NTMyMDB8N2MwZmEzZjF8MTcxNTcyMDM1OHwwfDA%3D

附件: 1-9.zip (2009-6-1 09:01:35, 149.25 KB) / 下载次数 21
http://bbs.mf8-china.com/forum.php?mod=attachment&aid=NTMyMDF8N2FhNmNlMzZ8MTcxNTcyMDM1OHwwfDA%3D
作者: Osullivan    时间: 2009-6-1 10:19:16

这几种情况我都试了不行,其他的几乎更不可能,难道分母可以不成倍数,那情况就太复杂了,所以请编程高手来帮忙啊

附件: 1.jpg (2009-6-1 10:19:16, 26.77 KB) / 下载次数 34
http://bbs.mf8-china.com/forum.php?mod=attachment&aid=NTMyMDR8NjJjZmQ0NTV8MTcxNTcyMDM1OHwwfDA%3D

附件: 2.jpg (2009-6-1 10:19:16, 16.63 KB) / 下载次数 34
http://bbs.mf8-china.com/forum.php?mod=attachment&aid=NTMyMDV8OWNiODQxYjJ8MTcxNTcyMDM1OHwwfDA%3D

附件: 3.jpg (2009-6-1 10:19:16, 16.81 KB) / 下载次数 31
http://bbs.mf8-china.com/forum.php?mod=attachment&aid=NTMyMDZ8YTFhYTIyMzd8MTcxNTcyMDM1OHwwfDA%3D

附件: 4.jpg (2009-6-1 10:19:16, 21.18 KB) / 下载次数 37
http://bbs.mf8-china.com/forum.php?mod=attachment&aid=NTMyMDd8YzVjODJjZjd8MTcxNTcyMDM1OHwwfDA%3D
作者: xdgtzsyyj    时间: 2009-6-1 10:48:34

你问的问题同样也是我要问的问题。等高手解答。
作者: bradwater    时间: 2009-6-1 11:03:35

沙发说的也太绝对了吧。分母成倍数也可以远不止你列写的那几种吧。还有就是,可以同是某个整数的倍数,这样也可以的~~~

分母是14。35。98。剩下2。6。7
分母是14。63。98。剩下2。5。7
分母是21。35。84。剩下6。7。9
分母是28。35。49。剩下1。6。7
分母是12。36。48。剩下5。7。9
分母是13。26。78。剩下4。5。9
分母是13。65。78。剩下4。6。9

。。。。。。。。。。。。。。。。。。。。。。。。。。

我只是列写几种情况,远非沙发考虑的那么有限的几种。。

特别的,分母是16的时候,另外两个可以是16的倍数,或8的倍数,或4的倍数,甚至是2的倍数,情况太多了吧。。

飘过~~

[ 本帖最后由 bradwater 于 2009-6-1 11:13 编辑 ]
作者: Osullivan    时间: 2009-6-1 11:41:58     标题: 回复 4# 的帖子

我只是举例说明,并没有说就是那几种情况啊,我考虑的是分母成倍数关系,举几例而已,别的没试过,4#不要误解
作者: lamianbu    时间: 2009-6-1 12:00:19

编程也不好解。

人肉解,还是有可能的。
作者: schuma    时间: 2009-6-1 12:26:04

9/12 + 5/34 + 7/68 = 1

当然,随便交换这三项也都是可以的

用matlab算的,程序也就几行而已...

[ 本帖最后由 schuma 于 2009-6-1 12:29 编辑 ]
作者: Osullivan    时间: 2009-6-1 12:31:11

额~~~~~~~~~~~~
我还试了一个多小时,都没结果。。。。
作者: r_517    时间: 2009-6-1 12:37:34

额。。我去编个程序解解
作者: r_517    时间: 2009-6-1 12:57:48

穷举得:
5/34 + 7/68 + 9/12 =1
作者: yq_118    时间: 2009-6-1 16:40:54

还是穷举法有效
作者: kexin_xiao    时间: 2009-6-1 20:04:34

7楼高手啊,佩服
作者: oboe    时间: 2009-6-2 11:37:18

题目不是这样穷举的吧.

观察可得
分子一位数,分母二位数,
那最大的数是9/12,最小的数是1/98

三个分数相加要等于1
那9/12=1/4 一定要存在.
否则加不到1
作者: hitholy    时间: 2009-6-2 13:42:50

原帖由 oboe 于 2009-6-2 11:37 发表
题目不是这样穷举的吧.

观察可得
分子一位数,分母二位数,
那最大的数是9/12,最小的数是1/98

三个分数相加要等于1
那9/12=1/4 一定要存在.
否则加不到1

如此看来,只有唯一解的
作者: tw1123581321    时间: 2009-6-2 13:42:59

吧里有没有MATLAB高手会弄自动排课程序的?有个想法也行啊!我不会弄的,但又要学!
作者: yilonglucky    时间: 2009-6-2 16:23:22     标题: 回复 7# 的帖子

敢问兄台怎么会接触到matlab???
作者: yilonglucky    时间: 2009-6-2 16:55:21

原帖由 Osullivan 于 2009-6-1 09:01 发表
1--9填入方格,数字不准重负,使等式成立
附件2为这题做的FLASH,可以下下来做这道题~~~~~~~~~~~~

编程后电脑自己算的,6个答案(调换位置我认为是不同解),任意其一即满足题意

[ 本帖最后由 yilonglucky 于 2009-6-2 18:45 编辑 ]

附件: [6个答案,任意其一即满足题意] answer.jpg (2009-6-2 16:55:21, 24.3 KB) / 下载次数 23
http://bbs.mf8-china.com/forum.php?mod=attachment&aid=NTM0MzZ8NTE1NTJmMDZ8MTcxNTcyMDM1OHwwfDA%3D
作者: jinyou    时间: 2009-6-2 17:20:57

请注意 9/12=3 /4
作者: r_517    时间: 2009-6-2 22:36:23

原帖由 oboe 于 2009-6-2 11:37 发表
题目不是这样穷举的吧.

观察可得
分子一位数,分母二位数,
那最大的数是9/12,最小的数是1/98

三个分数相加要等于1
那9/12=1/4 一定要存在.
否则加不到1


完全是无稽之谈。。。首先9/12=3/4,其次根据平均数原理只能证明至少有一个数大于1/3。完全无法得到其他任何结论。为什么9/12 “一定要存在”。就不可能是9/13、9/14……之类的么?
作者: r_517    时间: 2009-6-2 22:37:39     标题: 回复 7# 的帖子

matlab是个好东东~其实mathematica也不错。。。

我用个pascal在那里编个程序运行起来麻烦死了……
作者: yilonglucky    时间: 2009-6-2 22:55:58     标题: 回复 20# 的帖子

我用的C……
有几个语句我没有仔细想……很傻瓜式的把条件罗列出来让点点自己算……
我高中只学了一点点pascal……现在基本忘完了……
作者: d891320478    时间: 2009-6-3 18:21:39     标题: 回复 20# 的帖子

program ex;
var
  a,b,c,d,e,f,g,h,i:integer;
begin
for a:=1 to 9 do
for b:=1 to 9 do
  if b<>a then
for c:=1 to 9 do
  if(c<>a)and(c<>b)then
for d:=1 to 9 do
  if(d<>a)and(d<>b)and(d<>c)then
for e:=1 to 9 do
  if(e<>a)and(e<>b)and(e<>c)and(e<>d)then
for f:=1 to 9 do
  if(f<>a)and(f<>b)and(f<>c)and(f<>d)and(f<>e)then
for g:=1 to 9 do
  if(g<>a)and(g<>b)and(g<>c)and(g<>d)and(g<>e)and(g<>f)then
for h:=1 to 9 do
  if(h<>a)and(h<>b)and(h<>c)and(h<>d)and(h<>e)and(h<>f)and(h<>g)then
for i:=1 to 9 do
  if(i<>a)and(i<>b)and(i<>c)and(i<>d)and(i<>e)and(i<>f)and(i<>g)and(i<>h)then
   if a/(10*b+c)+d/(10*e+f)+g/(10*h+i)=1 then
    writeln(a,'/',10*b+c,'+',d,'/',10*e+f,'+',g,'/',10*h+i,'=1');
readln;
readln;
end.         
pascal 穷举
作者: visvate    时间: 2009-6-3 19:24:41

本帖最后由 visvate 于 2014-11-4 18:42 编辑

         .
作者: superacid    时间: 2009-6-3 21:55:18     标题: 回复 22# 的帖子

只要用8个变量a到h就可以了
i=45-a-b-c-d-e-f-g-h
作者: 铯_猪哥恐鸣    时间: 2009-6-3 23:29:59     标题: 回复 22# 的帖子

不用这样,直接用一个boolean数组表示某个数有没有用过,然后一部递归就行了。。你这样编程复杂度太大。。。9个数字还好,100个怎么办?(当然那样时间复杂度也超了,但如果有高效剪枝的话说不定还是可行的)
作者: superacid    时间: 2009-6-4 08:46:09

LS不愧是去年上海市NOIP第N名啊!
(注:我在 ★ 数学、算术趣题 ★ 里发帖的所有N都表示一个数)
作者: 77880066    时间: 2009-6-4 19:31:47

还是有高手的啊啊
作者: oboe    时间: 2009-6-9 08:39:49

原帖由 r_517 于 2009-6-2 22:36 发表


完全是无稽之谈。。。首先9/12=3/4,其次根据平均数原理只能证明至少有一个数大于1/3。完全无法得到其他任何结论。为什么9/12 “一定要存在”。就不可能是9/13、9/14……之类的么?


9/12是3/4。
之前我是计算错了一点。

但总体思路应该没错。
我的意思是:
三个分数相加等于1,那么必有一个分数大于1/3
所以,
当你选择的第一个分数是小于1/3,那么后面的排列组合可以不考虑穷举了。

同理,前二个分数之和必定要大于1/2

这样的算法,比递归的计算量要小一些。
作者: oboe    时间: 2009-6-9 08:43:01

原帖由 oboe 于 2009-6-9 08:39 发表

当你选择的第一个分数是小于1/3,那么后面的排列组合可以不考虑穷举了。

同理,前二个分数之和必定要大于1/2

...


补充一点,
把三个分数由大到小排列起来
第一个数是必大于1/3
改正一下:

把三个分数由大到小排列起来
前二个数之和必大于2/3

[ 本帖最后由 oboe 于 2009-6-9 08:53 编辑 ]
作者: Osullivan    时间: 2009-6-9 22:24:06

原帖由 oboe 于 2009-6-9 08:43 发表


补充一点,
要把三个分数由大到小排列起来,
第一个数是必大于1/3
改正一下:

要把三个分数由大到小排列起来,
前二个数之和必大于2/3



跟偶的想法一样哦~~~~~~~~
顶~~~~~
作者: matrixcl    时间: 2009-6-10 16:11:27

/*
1 - 9 数字填入

□     □     □
---- + ---- + ---- = 1
□□   □□   □□


a0     a3     a6
---- + ---- + ---- = 1
a1a2   a4a5   a7a8

a0*a4a5*a7a8 + a3*a1a2*a7a8 + a6*a1a2*a4a5 = a1a2*a4a5*a7a8

*/
void FillNum(int * arr, int index)
{
        int i, j;
        for (i = 1; i <= 9; i++)
        {
                for (j=0; j<index; j++)
                {
                        if (arr[j] == i)
                                break;
                }
                if (j == index)
                {
                        arr[index] = i;
                        if (index < 8)
                        {
                                FillNum(arr, index+1);
                        }
                        else
                        {
                                if (arr[0] * (arr[4] * 10 + arr[5]) * (arr[7] * 10 + arr[8]) + arr[3] * (arr[1] * 10 + arr[2]) * (arr[7] * 10 + arr[8])
                                        + arr[6] * (arr[1] * 10 + arr[2]) * (arr[4] * 10 + arr[5]) == (arr[1] * 10 + arr[2]) * (arr[4] * 10 + arr[5]) * (arr[7] * 10 + arr[8]) )
                                {
                                        printf("-------------------------------n");
                                        printf(" %2d     %2d     %2dn", arr[0], arr[3], arr[6]);
                                        printf("---- + ---- + ---- = 1n");
                                        printf("%2d%2d   %2d%2d   %2d%2dn", arr[1], arr[2], arr[4], arr[5], arr[7], arr[8]);
                                }
                                return;
                        }
                }
        }
}
void main()
{
        int arrNum[9];
        FillNum(arrNum, 0);
}

C++写的,递归实现
排列组合的问题,用程序似乎效率都不高,一般都是穷举法




欢迎光临 魔方吧·中文魔方俱乐部 (http://bbs.mf8-china.com/) Powered by Discuz! X2