| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 770 人关注过本帖
标题:[求助]快来看看吧!!!!!!
只看楼主 加入收藏
流浪者
Rank: 1
等 级:新手上路
帖 子:74
专家分:0
注 册:2005-4-24
收藏
 问题点数:0 回复次数:9 
[求助]快来看看吧!!!!!!
考虑不定方程组
      a1 + a2 + a3 + … + an = s
      1 / a1 + 1 / a2 + 1 / a3 + … + 1 / an = 1
      其中n, a1, a2 …均为参数,s已知。
     给出s求出不定方程组的一组正整数解。
   小弟有礼了~~~~
搜索更多相关主题的帖子: 方程 整数 参数 
2005-04-26 13:37
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
请问你有没有参考解?

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-04-26 16:01
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
穷举?目前只想到这个。

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-26 16:58
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 

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

#define TRUE 1 #define FALSE 0

#define BASEROOT 1 #define EPSILON 1e-24

typedef unsigned char BOOL;

static int rootcount;

/* 求两数中较大的数 */ double max(double,double); /* 比较两个浮点数是否相等 */ BOOL approx_equal(double,double); /* 计算整数解是否满足1/a1+1/a2+1/a3+...+1/an=1 */ BOOL judge(int *,int); /* 初始化数组 */ void init(int *,int); /* 利用回朔穷举所有可能整数解 */ void solve(int *,int,int);

int main() { int *roots,s; /* 初始化全局变量,假设最初误解*/ rootcount=0; printf("Please input the value of s="); scanf("%d",&s); if(s<=0) {printf("Input error!\n"); return 0;} /* 考虑根最多的情况时为指针分配适当的空间 */ roots=(int*)malloc((s/BASEROOT)*sizeof(int)); if(!roots) {printf("Cannot allocate memory!\n"); return 0;} /* 初始化数组 */ init(roots,s/BASEROOT); /* 求解并打印结果 */ solve(roots,s,0); /* 释放内存 */ free(roots); if(!rootcount) printf("No root at all!\n"); getch(); return 1; }

double max(double a,double b) { return a>b?a:b; }

BOOL approx_equal(double a,double b) { if(!a&&b) return fabs(b)<=EPSILON; if(a&&!b) return fabs(a)<=EPSILON; return (fabs(a-b)/max(fabs(a),fabs(b)))<=EPSILON; }

BOOL judge(int *roots,int pos) { register int i; double result; for(result=0,i=0;roots[i]&&i<=pos;result+=(1.0)/roots[i++]); if(approx_equal(result,1.0)) return TRUE; else return FALSE; }

void init(int *roots,int size) { register int i; for(i=0;i<size;roots[i++]=0); }

void solve(int *roots,int sum,int pos) { register int i; /* 当和数仍然不为0时,执行以下过程 */ if(sum) { if(sum==1) { /* 当和数为1时,最后可取的数字也只有1 */ roots[pos]=1; solve(roots,0,pos); } else { /* 当和数大于1时,可取得数字范围从1~(sum-1)使得最小的情况1,和最大 的情况sum-1他们的和仍然为sum,保证了若干根相加后仍等于sum */ for(i=BASEROOT;i<sum;i++) { roots[pos++]=i; /* 执行递归 */ solve(roots,sum-i,pos); pos--; } } } else { /* 判断所求的若干的根是否满足1/a1+1/a2+...+1/an=1 */ if(judge(roots,pos)) { rootcount++; i=0; while(roots[i]&&i<=pos) printf("roots[%d]=%4d",i,roots[i++]); printf("\n"); } } } 大家来帮忙看看,我这个方法是不是正确,为什么我取了n组数据测试,都没有解。。

[此贴子已经被作者于2005-4-26 18:01:59编辑过]


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-04-26 17:23
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
我对刚才的程序添加了注释,我研究了一下这个算法,还是不觉得有问题,可为什么只有1时有解而其他我列举的n个数据都做不出解,还有一点,我觉得这个程序效率太低,希望高手指点。。。。。

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-04-26 18:04
流浪者
Rank: 1
等 级:新手上路
帖 子:74
专家分:0
注 册:2005-4-24
收藏
得分:0 
谢谢大家的帮助,我给一个参考解:
s=2 无解,而s=10的解为:a1=2,a2=4,a3=4

我因我之为我而不同凡响~~~
2005-04-26 19:23
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 

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

#define TRUE 1 #define FALSE 0

#define BASEROOT 1 #define EPSILON 1e-24

typedef unsigned char BOOL;

static int rootcount;

/* 求两数中较大的数 */ double max(double,double); /* 比较两个浮点数是否相等 */ BOOL approx_equal(double,double); /* 计算整数解是否满足1/a1+1/a2+1/a3+...+1/an=1 */ BOOL judge(int *,int); /* 初始化数组 */ void init(int *,int); /* 利用回朔穷举所有可能整数解 */ void solve(int *,int,int);

int main() { int *roots,s; /* 初始化全局变量,假设最初误解*/ rootcount=0; printf("Please input the value of s="); scanf("%d",&s); if(s<=0) {printf("Input error!\n"); return 0;} /* 考虑根最多的情况时为指针分配适当的空间 */ roots=(int*)malloc((s/BASEROOT)*sizeof(int)); if(!roots) {printf("Cannot allocate memory!\n"); return 0;} /* 初始化数组 */ init(roots,s/BASEROOT); /* 求解并打印结果 */ solve(roots,s,0); /* 释放内存 */ free(roots); if(!rootcount) printf("No root at all!\n"); getch(); return 1; }

double max(double a,double b) { return a>b?a:b; }

BOOL approx_equal(double a,double b) { if(!a&&b) return fabs(b)<=EPSILON; if(a&&!b) return fabs(a)<=EPSILON; return (fabs(a-b)/max(fabs(a),fabs(b)))<=EPSILON; }

BOOL judge(int *roots,int pos) { register int i; double result; for(result=0,i=0;roots[i]&&i<=pos;result+=(1.0)/roots[i++]); if(approx_equal(result,1.0)) return TRUE; else return FALSE; }

void init(int *roots,int size) { register int i; for(i=0;i<size;roots[i++]=0); }

void solve(int *roots,int sum,int pos) { register int i; /* 当和数仍然不为0时,执行以下过程 */ if(sum) { for(i=BASEROOT;i<=sum;i++) { roots[pos++]=i; /* 执行递归 */ solve(roots,sum-i,pos); roots[pos]=0; pos--; } } else { /* 判断所求的若干的根是否满足1/a1+1/a2+...+1/an=1 */ if(judge(roots,pos)) { rootcount++; i=0; while(roots[i]&&i<=pos) printf("roots[%d]=%2d ",i,roots[i++]); printf("\n"); } } } 我找到问题了,原来我昨天的算法是漏解得,今天贴上修正的算法。。。


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-04-27 17:22
流浪者
Rank: 1
等 级:新手上路
帖 子:74
专家分:0
注 册:2005-4-24
收藏
得分:0 
太感谢了

可还有问题吧?

我因我之为我而不同凡响~~~
2005-04-27 18:24
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
就是还有一个问题,不知道如何把重复的解去掉。。。
比如2 4 4和4 2 4是一组相同的解,望高手指点。。。。

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-04-27 18:39
牛虻
Rank: 1
等 级:新手上路
威 望:1
帖 子:472
专家分:0
注 册:2004-10-1
收藏
得分:0 
目前只想出一种最笨的就是把答案进行排序,从大到小,或从小到大,就可以解决重复问题

土冒
2005-04-27 23:24
快速回复:[求助]快来看看吧!!!!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017814 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved