解题思路:
方法1:
假设当班级有x人时,一定会有y人及格(y<x)。使y/x的值大于P%,小于Q%,直接暴力,不想那么多。结果也AC了。
方法2:
再好好考虑,减少循环次数,不用双重循环,如何更好地解决。
假设当班级有x人时,一定会有y人及格(y<x),使y/x的值大于P%,小于Q%,
所以,反过来推,x*P%一定小于y,x*Q%大于y。
而y是一个整数,所以要求出最小的x,则必须x*Q%与x*P%之间恰好存在一个整数y,
也就是说可以表示为:(int)x*Q%-(int)x*P%==1。
例如:
样例数据是:P%=13,Q%=14.1
当人数x是15时,15*P%=1.95,15*Q%=2.115,y可以取整数2,满足要求
当人数x是14时,14*P%=1.82,14*Q%=1.974,y无法取整数,不满足要求
所以15是最小的。
参考代码:
//方法1:直接暴力,不想那么多。结果也AC了。 #include <stdio.h> int main() { double P,Q; int x,y; while(scanf("%lf%lf",&P,&Q)!=EOF) { for(x=1;;x++) { for(y=1;y<x;y++) { double tgl=(double)y/x*100; if(tgl>P && tgl<Q) //如果满足要求,则直接跳转到语句L1处执行 goto L1; else if(tgl>=Q) //如果y/x>=Q%,说明分子太大,或者分母太小,则退出内循环 break; } } L1:printf("%d\n",x); } return 0; }
//方法2:x*P%一定小于y,x*Q%大于y。 // 而y是一个整数,所以要求出最小的x,则必须x*Q%与x*P%之间恰好存在一个整数y, //也就是说可以表示为:(int)x*Q%-(int)x*P%==1。 #include<stdio.h> int main() { double P,Q; int x; while(scanf("%lf%lf",&P,&Q)!=EOF) { for(x=1;;x++) if( (int)(x*Q/100)-(int)(x*P/100)==1 ) { printf("%d\n",x); break; } } return 0; }
0.0分
10 人评分
WU-整数平均值 (C++代码)浏览:1307 |
C语言程序设计教程(第三版)课后习题9.1 (C语言代码)浏览:710 |
幸运数 (C++代码)浏览:1309 |
2004年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:676 |
字符逆序 (C语言代码)浏览:541 |
拆分位数 (C语言代码)浏览:558 |
C语言程序设计教程(第三版)课后习题10.1 (C++代码)浏览:529 |
1005答案错误为什么浏览:1988 |
C语言训练-斐波纳契数列 (C语言代码)浏览:540 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:405 |
我心态很好的 2020-03-31 21:43:57 |
根据y与x的关系,y最小,则x最小