【题目描述】
Peter 有 n根烟,他每吸完一根烟就把烟蒂保存起来,k(k>1)个烟蒂可以换一个新的烟,那么 Peter 最终能吸到多少根烟呢?
吸烟有害健康。
【输入格式】
每组测试数据一行包括两个整数 n, k(1 < n, k≤10^8)。
【输出格式】
对于每组测试数据,输出一行包括一个整数表示最终烟的根数。
【输入输出样例】
【样例1】
输入:
4 3
输出:
5
【样例2】
输入:
10 3
输出:
14
第一版代码:
#include <iostream>
using namespace std;
int main()
{
int n,k,sum,a;
scanf("%d %d",&n,&k);
sum=n;
if(k>1)
{
a=n/k;
sum=sum+a;
if(a!=0)
{
for(;;)
{
a=a/k;
sum=sum+a;
if(a==0)
break;
}
}
}
printf("%d",sum);
return 0;
}
测试结果:
出错测试点数据:
输入:10 2
输出:19
第二版代码:(已AC)
#include <iostream>
using namespace std;
int main()
{
int n,k,sum,a,rest; //rest用来统计进行完本轮兑换后剩余的烟头
scanf("%d %d",&n,&k);
sum=n;
a=n/k;
sum=sum+a;
if(a!=0)
{
for(;;)
{
a=a/k;
rest=a%k; //坑在这里!!
sum=sum+a;
if(rest!=0)
{
a=(a+rest)/k; //详情见table;
sum=sum+a;
}
if(a==0)
break;
}
}
printf("%d",sum);
return 0;
}
数据列举:
注意:
黄色的两个数据相加后还可以进行第四次的兑换。