How Many Fibs? hdu1316 高精度

本文详细介绍了使用Java进行大数运算的方法,并展示了如何在Eclipse中设置断点和进行单步执行调试。重点包括初始化大数数组、通过Scanner输入数据以及通过比较和循环实现大数计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://acm.hdu.edu.cn/showproblem.php?pid=1316

大数我就用JAVA。 膜拜JAVA,JAVA无敌。

今天学会了用eclipse-java 调试。

F8跳到下一个断点,ctrl+shift+b设断点,F5、F6单步执行。

import java.math.*;
import java.util.Scanner;

public class Main {
	public static void main(String args[]){
		int N=500;
		BigInteger ficc[]=new BigInteger[N];
		init(ficc);
		Scanner cin=new Scanner(System.in);
		BigInteger a,b;
		int i,count;
		while (cin.hasNext()){
			a=cin.nextBigInteger();
			b=cin.nextBigInteger();
			count=0;
			if (a.compareTo(BigInteger.ZERO)==0&&b.compareTo(BigInteger.ZERO)==0)
				break;
			for (i=0;i<N;i++){
				if (ficc[i].compareTo(a)!=-1&&ficc[i].compareTo(b)!=1)
					count++;
				if (ficc[i].compareTo(b)==1)
					break;
			}
			System.out.println(count);
		}
		cin.close();
	}
	public static void init(BigInteger ficc[]){
		int i;
		BigInteger ten,c;
		ficc[0]=new BigInteger("1");
		ficc[1]=new BigInteger("2");
		c=new BigInteger("1");
		ten=new BigInteger("10");
		for (i=0;i<101;i++)
			c=c.multiply(ten);
		i=2;
		while (ficc[i-1].compareTo(c)==-1){
			ficc[i]=ficc[i-1].add(ficc[i-2]);
			i++;
		}
	}
}


### 高精度斐波那契数列计算与取模实现方法 #### 背景介绍 斐波那契数列是一个经典的递归序列,其定义为 \( F(0) = 1 \),\( F(1) = 1 \),以及对于 \( n \geq 2 \),有 \( F(n) = F(n-1) + F(n-2) \)[^2]。然而,在实际应用中,当 \( n \) 较大时,普通的整型数据无法存储如此巨大的数值。因此,需要采用高精度算法来处理这些超大数据。 为了进一步优化性能并满足特定需求(如加密或竞赛中的约束条件),通常还需要对结果进行取模运算。这可以通过多种方式实现,包括但不限于矩阵快速幂和动态规划结合取模技术。 --- #### 方法一:基于字符串的大数加法模拟 此方法适用于纯高精度场景而不涉及任何取模操作的情况。通过将每个斐波那契数表示成字符数组的形式逐位相加完成整个过程: ```cpp #include <iostream> #include <vector> using namespace std; // 大数加法函数 string addStrings(const string& num1, const string& num2){ int carry = 0; string result = ""; int i = num1.size()-1, j = num2.size()-1; while(i >=0 || j>=0||carry>0){ long sum = (i<0?0:num1[i]-'0')+(j<0?0:num2[j]-'0')+carry; carry=sum/10; result += to_string(sum%10); --i;--j; } reverse(result.begin(),result.end()); return result; } void fibonacciHighPrecision(int n){ vector<string> fibs; fibs.push_back("1"); if(n==0){ cout<<fibs[0]; return ; } fibs.push_back("1"); for(int k=2;k<=n;++k){ fibs.push_back(addStrings(fibs[k-1],fibs[k-2])); } cout << fibs[n]<<endl; } ``` 上述代码实现了基本的高精度加法规则,并利用循环迭代构建完整的斐波那契序列直至目标索引位置为止[^1]。 --- #### 方法二:带取模功能的高效版本 如果只需要最终的结果而非全部中间值,则可以直接在累加过程中加入取模步骤减少内存消耗的同时也加快速度: ```cpp const int MOD = 2333333; // 自定义模块参数 long long mod_fib(long long n){ if(n ==0 || n ==1 )return 1; long long prev_prev =1 ,prev =1,temp; for(long long i=2;i<=n;i++){ temp=(prev+prev_prev)%MOD; prev_prev=prev; prev=temp; } return prev; } ``` 这种方法不仅保持了较低的空间复杂度O(1),而且时间效率也很理想-O(N).更重要的是它允许灵活调整`MOD`变量适应不同应用场景下的特殊要求比如密码学领域常用的大质数等等[^4]. --- #### 方法三:矩阵快速幂加速版 考虑到简单线性DP可能仍然不够迅速特别是面对极端情况的时候我们可以尝试转换思路借助于线代知识把原问题转化为矩阵乘积形式再配合上快速幂技巧从而达到log级别的时间复杂度效果极佳. 已知转移关系\[ \begin{bmatrix} F_{n}\\ F_{n-1} \end{bmatrix}=M^{n}\times\begin{bmatrix} F_1\\ F_0 \end{bmatrix},其中 M=\begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix}. \] 据此编写相应程序片段如下所示 : ```cpp struct Matrix{ long long mat[2][2]; }; Matrix multiply(Matrix A,Matrix B,int m){ Matrix C; memset(C.mat,0,sizeof(C.mat)); for(int i=0;i<2;i++)for(int j=0;j<2;j++)for(int k=0;k<2;k++) C.mat[i][j]=(C.mat[i][j]+A.mat[i][k]*B.mat[k][j])%m; return C; } Matrix powerMod(Matrix base,unsigned exp,int modulo){ Matrix ret={{{1,0},{0,1}}}; while(exp){ if(exp&1)ret=multiply(ret,base,modulo); base=multiply(base,base,modulo); exp>>=1; } return ret; } unsigned long long fastfib(unsigned index,unsigned mod){ if(index==0)return 1; Matrix initial={{ {1,1},{1,0} }}; Matrix res=powerMod(initial,index-1,mod); return res.mat[0][0]%mod; } ``` 以上即完成了从基础概念到高级技巧全方位覆盖关于如何有效率地求解大规模范围内任意指定序号处对应项值的任务讨论.[^5] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值