当前位置: 代码迷 >> C语言 >> 真正难题来了,高手请进!!
  详细解决方案

真正难题来了,高手请进!!

热度:161   发布时间:2005-02-21 11:37:00.0
真正难题来了,高手请进!!
从1到100找出9个整数,使这9个数的倒数和等于1,有几组找出几组,没有也要用程序证明。请给出详细算法和程序。
昨天想了很长时间,没找到好的解决方案!
搜索更多相关的解决方案: 难题  

----------------解决方案--------------------------------------------------------

#include <stdio.h> #include <stdlib.h> #include <conio.h>

void print_array(int *box,int size); void collector(int *box,int pos,int size); int inverse_sum(int *box,int size);

void main() { int box[9]={0};

collector(box,0,9); getch(); }

int inverse_sum(int *box,int size) { int i; int sum=0; for(i=0;i<size;i++) { sum += 1.0/box[i]; } return sum; }

void print_array(int *box,int size) { int i; for(i=0;i<size;i++) { printf("%4d",box[i]); } printf("\n"); }

void collector(int *box,int pos,int size) { if(pos < size && pos >= 0) { int i,j;

for(i=1;i<=100;i++) { box[pos]=i; pos++; collector(box,pos,size); pos--; } } else { if(inverse_sum(box,size) == 1) { print_array(box,size); } } } 三个数字的时候我测试过可以通过,不过9个数字是不是有点太慢了。。。。。。。。。。。。。。(可能会花几天几夜)

[此贴子已经被作者于2005-2-21 17:06:42编辑过]


----------------解决方案--------------------------------------------------------
没有也要用程序证明

什么意思????
----------------解决方案--------------------------------------------------------

大体上可以用回溯的方法做。实际上就是把100个整数中选出9个整数的方案全部穷举一遍,逐个验证。(第一遍是1 2 3 4 5 6 7 8 9;第二遍是1 2 3 4 5 6 7 8 10;第。。。。。。)

可以用下面的方法去掉许多不必要的情况:9个数中最小的数一定小于9,所以选取第一个数的时候就可以把它限定在2~~9的范围内。现在不妨先选5。那么剩下的8个倒数的和就成了0.5,0.5/8=0.0625,1/0.0625约为16.13,也就是说,这8个数种必有一个小于或等于16,这样就可把第二小的数的选取范围定在6~~16。照这样下去,每一次选一个数之前都算一下范围,应该可以在短时间内出结果。


----------------解决方案--------------------------------------------------------
本人比较粗,用了最笨的方法如下:
#include&lt;stdio.h&gt;
main()
{
int a,b,c,d,e,f,g,h,i;
for(a=1;a&lt;101;a++)
for(b=1;b&lt;101,b!=a;b++)
for(c=1;c&lt;101,c!=a,c!=b;c++)
for(d=1;d&lt;101;d++)
for(e=1;e&lt;101;e++)
for(f=1;f&lt;101;f++)
for(g=1;g&lt;101;g++)
for(h=1;h&lt;101;h++)
for(i=1;i&lt;101;i++)
  if(1.0/a+1.0/b+1.0/c+1.0/d+1.0/e+1.0/f+1.0/g+1.0/g+1.0/h+1.0/i==1)
  printf("a=%d,b=%d,c=%d,d=%d,e=%d,f=%d,g=%d,h=%d,i=%d",a,b,c,d,e,f,g,h,i);
  getch();
  }
若真的要算出来,那真的要等了,如果你只算4个数,那只要0.001秒就行了。
----------------解决方案--------------------------------------------------------
还是Alfred 的方法好
----------------解决方案--------------------------------------------------------
支持kaikai的看法

Alfred的方法的确很好。如果让我做,我也会那么做的。
----------------解决方案--------------------------------------------------------
TO: lmr 你的解题思路是对的,但是 if(1.0/a+1.0/b+1.0/c+1.0/d+1.0/e+1.0/f+1.0/g+1.0/g+1.0/h+1.0/i==1) 这句是不能得到正确的结果 1。浮点数是不能这样比大小的,有个精度问题 2.这是个埃及分数问题,要求是绝对相等,而浮点数计算(1.0/a+1.0/b+1.0/c+1.0/d+1.0/e+1.0/f+1.0/g+1.0/g+1.0/h+1.0/i)是有误差的。所以不调试就知道你的程序是不行的。
----------------解决方案--------------------------------------------------------
这个问题不是一个简单回溯就能解决的吧,感觉如果是从1~100中去找九个数入手,还有个大数计算的问题,比如:假定91,92,93,94,95,96,97,98,99的倒数之和为1,那么,浮点计算是行不通,上面我已经说明了,只有通分后相加,再比较分子分母,那么则有个大数计算的问题,速度不会太快。我有个感觉,应从分解1着手比较好,倒行逆施!
----------------解决方案--------------------------------------------------------
@knocker
貌似撤远了...
----------------解决方案--------------------------------------------------------
  相关解决方案