- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
安阳工学院
套汇问题
2011
年 11 月
16 日
0
问题描述
套汇问题:
套汇是指利用货币汇率的差异将一个单位的某种货币转换为大于一个单位的同一种货币。例如,假定一美元可以买 0.7 英镑,一英镑可以买 9.5 欧元,且
一欧元可以买 0.16 美元,通过货币兑换,一个商人可以从 1 美元开始买入,得到。0.7*9.5*0.16=1.064 美元,从而得到 6.4%的利润。
假如已知 n 种货币 c1,c2,…,cn 和有关的兑换率的 n*n 的表 R,其中,value
【i】【j】是一个单位货币 ci 可以得到的 ci 的单位数。
试设计一个算法,以确定是否存在一个货币序列 ci1,ci2,…,cik,使得: R【i1,i2】*R【i2,i3】*…R[ik,i1]1 并输出满足条件的所有的序列。
问题分析
套汇是指利用货币对率的差异,把一个单位的某种货币转换为大于一个单位的同种货币的方法。
套汇是指利用货币对率的差异,把一个单位的某种货币转换为大于一个单位的同种货币的方法。
例如,假定 1 美元可以买 46.4 印度卢比,1 印度卢比可以买 2.5 日元,1
日元可以买 0.0091 美元。通过货币兑换,一个商人可以从美元开始买入,得到
46.4*2.5*0.0091=1.0556 美元,因而获得 5.56%的利润。
假定已知 n 种货币 c1,c2,….,cn 和有关兑换率的 n*n 的表 R,1 单位货币
ci 可以买入 R[I,j]单位的货币 cj.
a) 写一个有效算法,以确定是否存在一个货币序列ci1,ci2,ci3,ci4,…,cik 满足 R[i1,i2]* R[i2,i3]… R[ik-1,ik] *R[ik,i1] 1 并分析算法的运行时间。b)写出一个有效的算法来输出该序列(如果存在这样的序列的话)
数据结构设计
此问题中主要用到数据结构中的图的知识点,首先建立一个图 G 用以下的这个结构体来存储图 G 的信息,图中个个参数的含义说明如下:
typedef struct{
int vexs[MAX_VERTECX_NUM]; //顶点向量 可以存储每个顶点的信息
float arc[MAX_VERTECX_NUM][MAX_VERTECX_NUM];
//邻接矩阵 主要存放关于边的信息
1
int vexnum,arcnum; //图中当前顶点数和弧数
}MGraph;
算法设计
算法设计的基本解题思想:
通过 FLOYD 算法求出最大环。判断最大环的权值之积是否大于 1,如果大于1 说明可以实现套汇,如果不大于 1 说明不能实现套汇。在求解最大环的同时记录下兑换过程中的步骤。
算法实现的数据结构:
int Path[MAX][MAX];//用来记录套汇过程中要经过的路径float value[MAX][MAX];//用来记录经过套汇操作后得到的值。算法中的关键步骤:
for(k=1;k=G-vexnum;k++)
{
for(i=1;i=G-vexnum;i++)
{
for(j=1;j=G-vexnum;j++)
{
if(value[i][k]*value[k][j]value[i][j])
//对 FLOYD 算法的修改,这里判断是否使兑换率增大,如果增大则记录下来
{
value[i][j]=value[i][k]*value[k][j]; Path[i][j]=Path[k][j];
}
}
}
}
在输出兑换序列时采用了递归算法:这个算法逆序输出了兑换序列。
void Procedure_print(int i,int j)
{
if(Path[i][j]==i)
{
printf(%d,i); return;
}
else if(Path[i][j]==0)//输出结点 i 与结点 j 之间不存在通路
printf(NO path);
else
{
2
printf(%d ,Path[i][j]);Procedure_print(i,Path[i][j]);//
printf(%d ,Path[i][j]);
Procedure_print(i,Path[i][j]);//{递归,货币 I 至 J 中间顶点}
}
}
程序设计
#includestdio.h #define MAX 20
#define MIN 0 int n;
int Path[MAX][MAX]; float value[MAX][MAX]; typedef struct{
int vexs[MAX]; //顶点向量 可以存储每个顶点的信息float arc[MAX][MAX];//邻接矩阵 主要存放关于边的信息int vexnum,arcnum; //图中当前顶点数和弧数
}MGraph;
void
原创力文档


文档评论(0)