一个采购员去银行兑换一张y元f分的支票,结果出纳员错给了f元y分。采购员用去了n分之后才发觉有错,于是清点了余额尚有2y元2f分,问该支票面额是多少?
输入格式:
输入在一行中给出小于100的正整数n。
输出格式:
在一行中按格式y.f
输出该支票的原始面额。如果无解,则输出No Solution
。
输入样例1:
23
输出样例1:
25.51
输入样例2:
22
输出样例2:
No Solution
第一种:
#include <stdio.h>
int main()
{
int y,f,n;
scanf("%d",&n);
for(y=0;y<100;y++){ //因为无论同一单位为分,还是元,它都无法超过100,因为元与分进制是100的关系
for(f=0;f<100;f++){
if(f+y/100.0==2*y+2*f/100.0+n/100.0){ //也可以写成100f+y==200y+2f+n,进制的问题,看是都看做“分”
printf("%d.%d",y,f); //还是都看做“元”,看做元的话,则n要÷100,因为是看做元,
return 0; //返回0,和主函数最后道理一样,否则写成break跳出循环后,还会输出No...
}
}
}
printf("No Solution");
return 0;
}
第二种
PTA-基础编程题目集-7-19 支票面额-C:数学解法https://blog.csdn.net/weixin_43656981/article/details/131034037
解题思路
f元y分在消费n分后为2y元2f分,由此得到等式:100f+y=200y+2f+n (1)
n=100(f-2y)+y-2f (2)
由于n、f、y三者均为整数,不妨新设一个i,使f-2y=i,则式(2)可以写成
n=100i+y-2(2y+i) (3)
即:y=(98i-n)/3 (4)
为了使y为整数,则98i-n能被3整除,凑个项约一下,求i+n能被3整除即可 //这里直接还用98i-n也是可以的。
由于n设定小于100,故不妨从1开始寻找最近的i
再将i代入式(4),得到y;再代入f = 2y+i,得到f
此时只需判定f是否小于100即可得出结论。
#include<stdio.h>
int main()
{
int N , F , Y , i = 1;
scanf("%d",&N);
while((i+n)%3!=0) //因为要让(98i-N)能被3整除,然后99i肯定能被3整除。
{ //99i-(98i-N)=i+N,若98i-N能被3整除,则i+N也肯定能被3整除。
i++;
}
Y = (98*i-N)/3;
F = i+2*Y;
if(F<100) //因为元和分直接进制是100,所以无法超过100
printf("%d.%d",Y,F);
else
printf("No Solution");
return 0;
}