关闭

C++ HOJ 猴子分桃

标签: 猴子分桃华为OJ迭代递归
1275人阅读 评论(1) 收藏 举报
分类:
【题目描述】
老猴子辛苦了一辈子,给那群小猴子们留下了一笔巨大的财富——一大堆桃子。老猴子决定把这些桃子分给小猴子。
第一个猴子来了,它把桃子分成五堆,五堆一样多,但还多出一个。它把剩下的一个留给老猴子,自己拿走其中的一堆。
第二个猴子来了,它把桃子分成五堆,五堆一样多,但又多出一个。它把多出的一个留给老猴子,自己拿走其中的一堆。 
后来的小猴子都如此照办。最后剩下的桃子全部留给老猴子。 

这里有n只小猴子,请你写个程序计算一下在开始时至少有多少个桃子,以及最后老猴子最少能得到几个桃子。


【输入】

输入包括多组测试数据。

每组测试数据包括一个整数n(1≤n≤20)。

输入以0结束,该行不做处理。


【输出】

每组测试数据对应一行输出。

包括两个整数a,b。 

分别代表开始时最小需要的桃子数,和结束后老猴子最少能得到的桃子数。


【示例输入】
5

1

0


【示例输出】

3121 1025

1 1

【算法思想】

an表示第n个猴子来的时候,总共多少个桃子。

求特征函数: a1=a1-(a1-1)/5  ;a1=1          

求通项公式:{an+4}={a1+4}q^(n-1)={a1+4}(5/4)^(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;  
}  



【误区释疑】

1.总共一个猴子,那只猴子拿到的桃子数目为Numa;总共两个猴子拿桃子,最后一个猴子拿到的桃子数目为Numb;总共三只猴子拿桃子,最后一个猴子拿到的桃子数目为Numc。这里的Numa!=Numb!=Numc;

2.查找总共多少只猴子,如果按不论总共多少只猴子,最后一只猴子拿到的数目都是Num个,之前的猴子数目就会混淆,这里一定要区分开两个概念,总共N只猴子拿到的桃子数目和第N个猴子拿到的数目是不一样的。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:427093次
    • 积分:9558
    • 等级:
    • 排名:第1861名
    • 原创:535篇
    • 转载:4篇
    • 译文:0篇
    • 评论:172条