一个采购员去银行兑换一张y元f分的支票,结果出纳员错给了f元y分。采购员用去了n分之后才发觉有错,于是清点了余额尚有2y元2f分,问该支票面额是多少?
输入格式:
输入在一行中给出小于100的正整数n。
输出格式:
在一行中按格式y.f
输出该支票的原始面额。如果无解,则输出No Solution
。
输入样例1:
23
输出样例1:
25.51
输入样例2:
22
输出样例2:
No Solution
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
题解
最讨厌披着代码外衣的数学题了!!!最开始的想法是将y,f合并成一个参数,解一元一次方程即可,但是显然不行,C语言没有取小数变整数这样的操作,而且这个采购员花钱也并不是花完分再去花元,这样就无法通过解方程来算这道题。
想了半天放弃解方程转而思考直接暴力遍历y与f。但这时候y与f俩个参数遍历到多少才停又成了一个问题。还是要到方程里找答案。我们列出这个题目给出的唯一一个等式:100f+y-n=2(100*y+f)
这里注意一元等于一百分(元、角、分)。我真是太久没见过分了最开始直接当1元等于10分来算了。
将等式整理得到:98f-199y=n
题目只给出了n的范围为0<n<100,但是注意分析,银行在兑换支票时一定会化零为整,因此有隐含条件f<100。继续分析等式,由于y>=0,f>=0,f必须在>2y的情况下才能使n为正数,故而得到f的取值范围(2y<f<100),对于y有y=(98f-n)/199,因为f<100,n>0,y<(9800-0)/199,得到f和y的范围后就是两个for直接暴力找解了。
#include <stdio.h>
int main(){
//int i=100;
//while(i--){
int n,y,f;
scanf("%d",&n);
for(y=0;y<50;y++){
for(f=2*y+1;f<100;f++){//兑换支票时,不会有大于等于100分的分出现
if(98*f-199*y==n){
printf("%d.%d\n",y,f);
return 0;
}
}
}
printf("No Solution");
//printf("\n");}
return 0;
}