sicily 1029

思路:首先创建两个函数operate() 和cycle(),其中operate()求得两个大数之和,cycle()将数组向后平移一位。首先初始化数组num,数组num存储兔子的数量,其中num[0]表示成熟兔子的数量,num[i]表示出生第i个月的数量。分别表示出第i个月不同种类兔子的数量,而后依次递推(第i个月中出生x个月兔子的数量等于第i-1个月出生x-1个月兔子的数量),直至到达第m个月。最后把数组num中所有的元素(除去最后一个)相加既得到兔子的总数。

程序

#include <iostream>
#include "string"
using namespace std;

string operate(string a,string b)    //求两个大数之和
{
  int aa = a.length();
  int bb = b.length();
  string result;                //用来保存两个string 的和
        string q;
  //保证两个数的长度相等,长度小的补0
  if (aa>bb)
  {
      q.assign(aa-bb,'0');      //assagin函数为c++中的赋值函数
   b=q+b;
  }
  else
  {
   q.assign(bb-aa,'0');
   a=q+a;
  }
  //两数相加
  int u = 0;                    //u为进位
  result = result.assign(a.length(),'0');
  for (int i = a.length()-1;i>=0;i--)
  {
   int temp = (a[i] - '0') + (b[i] - '0') + u;
   if(temp >=10)
   {
    u = 1;
    temp = temp%10;
   }
   else
    u = 0;
   
   result[i] = temp + '0';
  }
        //如果最后一位出现大于10的情况时,应该向前进一位
  if(u ==1)
   result= '1'+result;
  return result;
}
void cycle(string num[],int n)   //把数组num里面第数向后平移一位,并且新的num[0]等于旧的num[0]与新的num[n-1]之和
{
 for(int i=n-1;i>0;i--)
  num[i]=num[i-1];
 
 num[0]=operate(num[0],num[n-1]);
}
int main()
{
 int m,d;
    while(cin>>m>>d)
    {
     if(m==0&&d==0)
     break;
     string num[11];                   //数组num存储兔子的数量,其中num[0]表示成熟兔子的数量,num[i]表示出生第i个月的数量
     string sum="0";
     num[0]="1";
     for(int i=1;i<=m;i++)             //初始化数组num
        num[i]="0";
     for(int i=1;i<=d;i++)            //求第i个月各种类的数量
        cycle(num,m+1);            
     
     for(int i=0;i<m;i++)            //求得所有兔子之和,此时num[0]中已经包含了num[m]的数量
       sum=operate(num[i],sum);
     
    cout<<sum<<endl;
    }
 return 0;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值