Astar Round1 1002 Problem B

全1序列这道题,就是斐波那契大数。

用了一个大数模板。

#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
string &_string_add_string (const string &a, const string &b, string &res) {
    int sum_value = 0, add_bit = 0;
    const int alen = a.length(), blen = b.length();
    res = "0" + (alen > blen ? a : b);
    for (int i = alen-1, j = blen-1, k = res.length() - 1;
            i >= 0 || j >= 0 || add_bit > 0;
            --i, --j, --k) {
        sum_value = (i>=0 ? a[i]-48: 0) + (j>=0 ? b[j]-48: 0) + add_bit;
        add_bit = sum_value / 10;
        res[k] = sum_value%10 + '0';
    }
    if (res[0] == '0') { res = res.substr (1, res.length() - 1); }
    return res;
}
string fib (int n) {
    if (0 == n) { return "0"; }
    if (1 == n || 2 == n) { return "1"; }
    string a = "1", b = "1", ret = "0";
    for (int i = 3; i <= n; ++i) {
        _string_add_string (a, b, ret);
        b = a;
        a = ret;
    }
    return ret;
}
int main (void) {
    int n;
    string a, b, c;
    string ret;
    while (scanf ("%d", &n) != EOF) {
        printf ("%s\n", fib (n+1).c_str() );
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值