7-19 支票面额 (15 分)

一个采购员去银行兑换一张y元f分的支票,结果出纳员错给了f元y分。采购员用去了n分之后才发觉有错,于是清点了余额尚有2y元2f分,问该支票面额是多少?

输入格式:
输入在一行中给出小于100的正整数n。

输出格式:
在一行中按格式y.f输出该支票的原始面额。如果无解,则输出No Solution。

输入样例1:

23

输出样例1:

25.51

输入样例2:

22

输出样例2:

No Solution

下面是代码和注释:

#include <iostream>
using namespace std;

int main()
{
	int n;
	cin >> n;
	int y, f, a, y1;
	double p, q;
	for (y = 0; y < 100; y++) {					//y为小于100的整数
		a = 0;									//a记录是否借位
		if (y < n) {							//如果y小于n
			a++;								//则向前借位
			y1 = y + 100 - n;					//y1记录减去n后的y值
		}
		else									//y不小于n
			y1 = y - n;
        f = y1 / 2;								//根据f.y-0.n=2y.2f=y1.2f,可以得出f=y1/2
        if (f < y) f = f+50;					//同样,根据公式可以知道f为y得2倍,所以当f小于y时,f需要增加50
        if (a == 1) {
            p = f-1 + (y-n+100) * 1.0 / 100;	//正向计算有借位时的结果
            q = (y + f * 1.0 / 100)*2;			//反向根据公式推出结果
            if (p==q) {							//如果相等
                cout << y << "." << f;			//则输出结果
                return 0;						//结束循环
            }
        }
        else {
            p = f + (y-n) * 1.0 / 100;			//正向计算没有借位时的结果
            q = (y + f * 1.0 / 100)*2;			//反向根据公式推出结果
            if (p == q) {
                cout << y << "." << f;
                return 0;
            }
        }
    }
	cout << "No Solution";						//循环结束,则表示没有符合条件的值
	return 0;
}

f自增50的原因:
由题意可以得出下面的公式:

			f.y-0.n = f1.y1 = 2y.2f = 2*(y.f)		//f1、y1均为计算后的结果值

当f小于y时:则表示在2y.2f,2*f >100,向前进了一位,可以推出f>50;f=(100+y1)/ 2。
而代码中有f = y1 / 2; y1已经除以了2,所以应当自增50。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值