首先要掌握c语言计算大数加法。要解决大数加法的问题主要是要解决大数存储的问题,我这里用到数组来解决问题。具体该如何计算大数相加,我用了b站up主萌萌哒吉吉的视频中的方法,这里是视频链接c语言大数加法。我主要是写如何将大数加法和斐波那契数列结合起来。不难发现,视频中的核心代码就是计算的那部分,如下所示
for(up=0,i=0;i<MAXLEN;i++){
tmp=a[i]+b[i]+up;
a[i]=tmp%10;
up=tmp/10;
}
那么接下来的问题就是如何能够计算110项的问题了,以下是具体代码,解释也有
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main()
{
int n;
scanf("%d",&n);
int up,tmp,max=100; //首先说明我是从数组下标1开始存储的,0号下标我没用
int a[max+1]={0}; //用来存储每一次计算的结果以及作为计算第n项时的n-1那一项
int b[max+1]={0}; //作为计算第n项时的n-2那一项
int c[max+1]; //用来存储第n-1项,作为计算第n+1项时的第n-2项,给b数组用
int i,j,k,count=1;
a[1]=1; //斐波那契数列第2项
b[1]=0; //斐波那契数列第1项
while(count<=n-2){ //因为第1,2项不需要我们计算,所以循环次数要减掉两次
for(i=max;i>=1;i--){ //找到当前a数组的最高位
if(a[i]!=0){ //若a[i]不为0,说明此时的i就是最高位
for(k=1;k<=i;k++){ //让c数组存储此时a数组中的数值,以便下一轮循环时b数组用
c[k]=a[k];
}
//计算大数加法的核心代码,但是和视频中的条件不太一样
for(up=0,j=1;j<=i || up!=0;j++){
//但是要小心一个问题,在循环条件中一定是j<=i || up!=0,
//少一个条件都不行,j<=i实现了最高位(及第i位)之前位数的相加
//up!=0实现了最高位有进位的计算
tmp=a[j]+b[j]+up;
a[j]=tmp%10;
up=tmp/10;
}
for(k=1;k<=i;k++){
b[k]=c[k]; //让b数组存储第n-1项
}
//必须要加一个break否则会出问题,是因为for(i=max;i>=1;i--)中i>=1这个条件
//我不好说,可以自己试一下
break;
}
}
count++;
}
for(i=max;i>=1;i--) { //输出
if(a[i]!=0){
for(j=i;j>=1;j--){
printf("%d",a[j]);
}
break; //也必须要加一个break,否则会重复输出
}
}
return 0;
}