昨天想了很长时间,没找到好的解决方案!
----------------解决方案--------------------------------------------------------
#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<stdio.h>
main()
{
int a,b,c,d,e,f,g,h,i;
for(a=1;a<101;a++)
for(b=1;b<101,b!=a;b++)
for(c=1;c<101,c!=a,c!=b;c++)
for(d=1;d<101;d++)
for(e=1;e<101;e++)
for(f=1;f<101;f++)
for(g=1;g<101;g++)
for(h=1;h<101;h++)
for(i=1;i<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
貌似撤远了...
----------------解决方案--------------------------------------------------------