一个采购员去银行兑换一张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。