题目大意:
比如美元对法郎的汇率是4.81724,就意味着10美元可以换得48.1724法郎(即汇率乘以兑换前的货币值),兑换的规则是一次兑换只能在两种货币之间进行,并且任意两种货币之间兑换都必须四舍五入至百分位(即分)。
现米勒先生想去多个国家旅游,始发点和终点都是美国,带有一定初始资金(美元),欲计算一圈回来后重新兑换得到的美元为多少钱。
有多个测例(题中给出测例数量),每个测例中先给出五个国家货币之间的汇率表(以5 × 5矩阵表示,其中1号国家是美国),接着再给出多个旅游路线(起始和终点都是1号国家,题中只给出起点终点外的n个中间国家,当n为0时表示该测例结束)和相应的初始资金(中途的国家最多有10个),对于每个测例中的每条路线都输出回到起点后的最终资金值,资金值取浮点数,四舍五入至分。
注释代码:
/*
* Problem ID : ZOJ 1058 Currency Exchange
* Author : Lirx.t.Una
* Language : GCC
* Run Time : 0 ms
* Run Memory : 168 KB
*/
#pragma GCC optimize("O2")
#include <stdio.h>
//number of country,旅游路线中国家的总数(5 + 1)
#define COUNTRYN 6
//maximum length of trip,旅游路线长
//始末都是1,中间最多有10个国家,总长最大为12
#define MAXTRIPLEN 12
float exr[COUNTRYN][COUNTRYN];//exchange rate,保存各国家之间汇率的矩阵
int trp[MAXTRIPLEN];//trip,记录旅游路线
int
main() {
int nscn;
int n;//中途国家的个数
float m;//初始资金
int i, j;//计数变量
float cash;//旅游途中不停兑换所得的现金
trp[0] = 1;//旅途起点为1(美国)
scanf("%d", &nscn);
while ( nscn-- ) {
for ( i = 1; i < COUNTRYN; i++ )
for ( j = 1; j < COUNTRYN; j++ )
scanf("%f", &exr[i][j]);
while ( scanf("%d", &n), n ) {
for ( i = 1; i <= n; i++ )
scanf("%d", trp + i);
trp[i] = 1;//终点为美国
scanf("%f", &m);
for ( cash = m, i = 1; i <= n + 1; i++ ) {
cash *= exr[trp[i - 1]][trp[i]];
//由于每次兑换都需要四舍五入至美分,因此需要在舍入后将分后面的小数抛弃
//方法是通过float至int的强制类型转换将小数部分截断
//前提是现得将其扩大100倍,舍入后截断小数部分,再缩小100倍即可
cash = (float)(int)( cash * 100 + 0.5f ) / 100.0f;
}
printf("%.2f\n", cash);
}
if (nscn)
putchar('\n');//每块测例之间用一空行隔开
}
return 0;
}
无注释代码:
#pragma GCC optimize("O2")
#include <stdio.h>
#define COUNTRYN 6
#define MAXTRIPLEN 12
float exr[COUNTRYN][COUNTRYN];
int trp[MAXTRIPLEN];
int
main() {
int nscn;
int n;
float m;
int i, j;
float cash;
trp[0] = 1;
scanf("%d", &nscn);
while ( nscn-- ) {
for ( i = 1; i < COUNTRYN; i++ )
for ( j = 1; j < COUNTRYN; j++ )
scanf("%f", &exr[i][j]);
while ( scanf("%d", &n), n ) {
for ( i = 1; i <= n; i++ )
scanf("%d", trp + i);
trp[i] = 1;
scanf("%f", &m);
for ( cash = m, i = 1; i <= n + 1; i++ ) {
cash *= exr[trp[i - 1]][trp[i]];
cash = (float)(int)( cash * 100 + 0.5f ) / 100.0f;
}
printf("%.2f\n", cash);
}
if (nscn)
putchar('\n');
}
return 0;
}
单词解释:
Issac:人名
Bernand:人名
Miller:人名,米勒; n, 磨坊主
franc:n, 法郎
hundredth:n, 百分之一,第一百
be rounded to:...被四舍五入至....
five:vt, 四舍五入...
be fiven to:...被四舍五入至...
unspent:adj, 未用完的
generate:vt, 生成
cent:n, 美分
decimal point:n, 小数点
multiple:adj, 多重的