標籤:猴子分桃 華為oj 迭代 遞迴
【題目描述】
老猴子辛苦了一輩子,給那群小猴子們留下了一筆巨大的財富——一大堆桃子。老猴子決定把這些桃子分給小猴子。
第一個猴子來了,它把桃子分成五堆,五堆一樣多,但還多出一個。它把剩下的一個留給老猴子,自己拿走其中的一堆。
第二個猴子來了,它把桃子分成五堆,五堆一樣多,但又多出一個。它把多出的一個留給老猴子,自己拿走其中的一堆。
後來的小猴子都如此照辦。最後剩下的桃子全部留給老猴子。
這裡有n只小猴子,請你寫個程式計算一下在開始時至少有多少個桃子,以及最後老猴子最少能得到幾個桃子。
【輸入】
輸入包括多組測試資料。
每組測試資料包括一個整數n(1≤n≤20)。
輸入以0結束,該行不做處理。
【輸出】
每組測試資料對應一行輸出。
包括兩個整數a,b。
分別代表開始時最小需要的桃子數,和結束後老猴子最少能得到的桃子數。
【樣本輸入】
5
1
0
【樣本輸出】
3121 1025
1 1
【演算法思想】
求特徵函數: a1=a1-(a1-1)/5 ;a1=1
求通項公式 :{an-1}={a1-1}q^(n-1)={a1-1}(4/5)^(n-1)
【屌絲代碼】
#include <stdio.h>
#include <iostream>
int main()
{
int n, i;
int sum, l, t;
while (scanf("%d", &n)==1 && n)
{
l = 1;
for (i=1; i<n; i++)
l *= 5;
sum = 1+5*(l-1);
t = sum;
for (i=1; i<=n-1; i++)
t = (t-1)/5*4;
printf("%d %d\n", sum, t+n);
}
printf("%d %d\n", sum, t+n);
return 0;
}
【吊軌代碼】
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n;
long long total_num,old_num;
while(cin>>n && n!=0)
{
total_num=pow(5,n)-4;
old_num=n+pow(0.8,n)*pow(5,n)-4;
cout<<total_num<<" "<<old_num<<endl;
}
return 0;
}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
C++ 華為OJ 猴子分桃