目录
1.题目描述
2.输入描述
3.示例提示
4.问题分析
5.通过代码
1.题目描述
贝博士是个大忙人,他在设计和制造一台非常复杂的机械式计算机。 最近贝博士有一点烦恼,因为机械零件的种类繁多,磨损又快,经费不太够用了。不过,他发现有一些机械零件在磨损以后,可以用若干同一型号的磨损旧零件重新回炉熔化以后再铸造出一个该型号的新零件,符合这样的特点的机械零件称为可翻新零件。 于是贝博士请来了他的助手艾小姐,请她统计一下有多少种型号的可翻新零件,每一种目前有多少存量又能以多少个旧零件重新回炉铸造出一个新零件,要求计算出对应于每一种机械零件他最终能使用的零件个数。
2.输入描述
第一行输入两个数p和q,表示某型号的零件存量为p,且可以用q个旧零件重新回炉铸造出一个新零件。
3.示例提示
输出:每一种可翻新机械零件最终可以使用的个数。
4.问题分析
这道题比较复杂而且误导性很强,以下我将逐层分析这道题,我也花了很久的时间,可能是有段时间没有做OJ题了。
题目分析:本题是要求我们求出所有的被用到的零件个数,但是测试样例6 6其实就一个过程就结束了,让做题的人
简单以为只要简单一个循环就行,实际上不然,本题的循环跳出条件需要实时分析。
由于测试样例6 6太过简单,我们另外举例两个数来讲解(30,4).
一共四个参数p,q,r,sum,r是表示废品区的废品数量。
循环分析如下所示:
首先初始值为的值为输入的值。
第一轮循环分为两步:1.30个产品全部用完,移入废品区,同时sum计数开始。
2.废品区开始重铸30/4=7,剩下2个,7个产品移入产品区(p),sum此时不计数
第一轮数据结果分为两行如下表所示。
第二轮循环分为两步:1.7个产品全部用完,移入废品区,同时sum计数开始。
2.废品区开始重铸7/4=2,剩下1个,2个新产品移入产品区(p),sum此时不计数
第二轮数据结果分为两行如下表所示。
第三轮循环分为两步:1.2个产品全部用完,移入废品区,同时sum计数开始。
2.废品区开始重铸2/4=0,剩下3个,此时的r<q,不会在产生新产品了,循环结束
第三轮数据结果分为两行如下表所示。
产品循环各区数据表
p q r sum
begin 30 4 0 0
First_1 0 4 30 30
First_2 7 4 2 30
Secon_1 0 4 9 37
Secon_2 2 4 1 37
Third_1 0 4 3 39(r<q,out!)
5.通过代码
#include<iostream>
using namespace std;
int main()
{
int p,q;
int r=0;
int sum=0;
cin>>p>>q;
while(true)
{
//循环第一步
sum+=p;
r=r+p;
p=0;
//判定条件
if(r<q) break;
//循环第二步
p=r/q;
r=r%q;
}
cout<<sum<<endl;
return 0;
}