码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 华为OJ 猴子分桃

时间:2015-07-09 19:53:31      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:猴子分桃   华为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 猴子分桃

标签:猴子分桃   华为oj   迭代   递归   

原文地址:http://blog.csdn.net/u013630349/article/details/46820447

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!