Death to Binary? POJ - 2116(模拟 斐波那契数列)

21 篇文章 0 订阅

题目地址:http://poj.org/problem?id=2116
思路:输入两个斐波那契数列基数制的数,转换成十进制,相加,再把这三个十进制数转换成规范性的斐波那契数列基数制的数。
注意输入的斐波那契数列基数制的数可能有零
在转换成规范性的斐波那契数列基数制的数时,直接将十进制数化成尽可能大的斐波那契数列基数位即可。当斐波那契数列基数的第n位是1,第n-1位不可能也是1,因为 Fn = Fn-1 + Fn-2,第n-1位也是1时,第n+1位会变成1,而第n+1位会变成1早就转化成功了,不会存在第n+1位可以放两个1,Fn = Fn-1 + Fn-2,Fn-1 > Fn-2,那么会直接显示在第n+2位上。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <map>
#include <set>
#include <vector>
#include <map>
#include <bitset>
#include <algorithm>
#include <queue>
#include <stack>
#include <cmath>
#define ll long long
using namespace std;
long long f[51];
void init()
{
    f[0]=1;
    f[1]=2;
    for(int i=2;i<42;i++)
    {
        f[i]=f[i-1]+f[i-2];
    }
}
void solve(long long ans,string &s)
{
    int flag=0;
    for(int i=40;i>=0;i--)
    {
        if(ans>=f[i])
        {
            flag=1;
            s+='1';
            ans-=f[i];
        }
        else
        {
            if(flag)
              s+='0';
        }
    }
}
long long num(string s)
{
    int j=0;
    long long sum=0;
    for(int i=s.length()-1;i>=0;i--)
    {
        if(s[i]=='1')
           sum+=f[j];
        j++;
    }
    return sum;
}
int main()
{
    init();
   string s1,s2,s3;
   long long a,b,c;
  while(cin>>s1>>s2)
  {
       a=num(s1);
  b=num(s2);
   c=a+b;
   s1.clear();s2.clear();s3.clear();
   solve(a,s1);
   //cout<<s1;
   solve(b,s2);solve(c,s3);
    if(a==0) s1+='0';
   if(b==0)  s2+='0';
   if(c==0)   s3+='0';
   int l1=s1.length();
   int l2=s2.length();
   int l3=s3.length();
   cout<<' ';
   for(int i=0;i<=(l3-l1);i++)
        cout<<' ';
   cout<<s1<<endl;
     cout<<'+';
    for(int i=0;i<=(l3-l2);i++)
        cout<<' ';
   cout<<s2<<endl;
   cout<<' '; cout<<' ';
   for(int i=0;i<l3;i++)
   cout<<'-';
      cout<<endl;
 cout<<' '; cout<<' ';
  cout<<s3<<endl;
     cout<<endl;
  }


    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值