Fibonacci(斐波那契)序列的生成和大整数乘法问题

问题一:Fibonacci数列定义为f0=f1=1,fn=fn-1+fn-2,从键盘输入n,计算fn的位数并输出,同时输出fn的结果(0<=n<=1000)

问题二:不能用基本数据类型存储的整数称为大整数,涉及到大整数的乘法运算称为大整数乘法。现给你两个不超过200位的非负整数,请编程输出它们的准确乘积。

事实上将这个两个题放在一起,在于它们都有共通之处,实现斐波那契数列的计算,n较大时难以用基本数据类型储存,同理, 大整数也是一样的,此时就需要采用数组,并得实现进位操作。

问题一代码:

#include<stdio.h>
#include<string.h>
#define MAXSIZE 1000//定义符号常量MAXSIZE
int main()
{
    int f0[MAXSIZE] = { 0 }, f1[MAXSIZE] = { 0 }, f2[MAXSIZE] = { 0 };
    int i, j, n, s0 = 1, s1 = 1, s2 = 1;//s0,s1,s2储存位数
    f0[0] = f1[0] = f2[0] = 1; scanf("%d", &n);
    for (i = 2; i <= n; i++) {//递推计算n
        memeset(f2, 0, sizeof(f2));//fn清零
        for (j = 0; j < s1; j++) {
            f2[j] += f1[j] + f0[j];
            if (f2[j] >= 10) {
                f2[j + 1] += f2[j] / 10; f2[j] %= 10;//进位处理
            }
        }
        if (f2[j] != 0)s2 = s1 + 1; else s2 = s1;
        for (j = 0; j < s2; j++) {//为计算下一个数做准备
            f0[j] = f1[j]; f1[j] = f2[j];
        }
        s0 = s1; s1 = s2;
    }
    printf("f%d,%d", n, s2);
    for (i = s2 - 1; i >= 0; i--)printf("%d", f2[i]);//从最高位依次输出
    return 0;
}

问题二代码:

#include<stdio.h>
#include<string.h>
int main()
{
    int T;
    scanf("%d", &T);
    while (T--)
    {
        char s1[200], s2[200];
        int i, j, len1, len2, a, b, n, a1[200] = { 0 }, a2[200] = { 0 }, s3[400] = { 0 };
        scanf("%s%s", s1, s2);
        len1 = strlen(s1);
        len2 = strlen(s2);
        for (i = len1 - 1, j = 0; i >= 0; i--, j++) {
            a1[j] = s1[i] - '0';
        }
        for (i = len2 - 1, j = 0; i >= 0; i--, j++) {
            a2[j] = s2[i] - '0';
        }
        for (i = 0; i < len1; i++)
        {
            for (j = 0; j < len2; j++)
            {
                s3[i + j] += a1[i] * a2[j];

            }
        }
        for (int l = 0; l <= len1 + len2 - 2; l++)
        {

            s3[l + 1] += (s3[l] / 10);
            s3[l] = s3[l] % 10;

        }
        int k;
        for (k = len1 + len2 - 1; k >= 0; k--)
        {
            if (s3[k] != 0)
            {
                break;
            }
        }
        if (k == -1)
            printf("%d", k + 1);
        else
        {
            for (int m = k; m >= 0; m--)
            {
                printf("%d", s3[m]);
            }
        }
        printf("\n");
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值