ZOJ 1058 Currency Exchange

题目大意:

        比如美元对法郎的汇率是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, 多重的


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值