斐波那契数列求第110项和第200项

首先要掌握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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值