HDU1568 Fibonacci

博客围绕HDU1568题目,要求对输入n输出斐波那契数列第n项的前4个数字。通过推导几个数学结论,对斐波那契通项公式取对数简化运算,利用小数运算使末尾数字失去精度,保留前几位,最终输出前4位有效数字得到答案。

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

HDU1568 Fibonacci

题目大意:

  对于每一个输入n(0<=n<=100000000),输出斐波那契数列第n项的前4个数字。

思路:

  附:因为博主比较懒,本文章中几张公式的图片来自 以下博客;

  PY:看到这道题,第一个想到的是这是一道入门OI的斐波那契数列第n项取模的水题,结果就顺手打了一个程序结果发现样例WA了,然后才发现是第n项的前4个数字。。

  这是一道数学题!

  首先,我们来推几个结论。

  结论一:

    记f(n)为fibonacci数列第n项的值,

    那么f(n) = ,这是通项公式,这里不给出证明。 附:对于本题,当n = 0, f(0) = 0。

  结论二:

    对于正实数n,显然n = a * 10k ( a <= 10, k为整数) (即科学计数法)。

    那么log10( n ) = log10( a * 10k ) = log10( a ) + k

    因为,a <= 10, 所以,log10( a ) < 1,又因为k为整数,所以,log10( a ) 为 log10( a * 10k ) 的小数部分。

    所以log10( a ) = log10( a * 10k ) - [ log10( a * 10k ) ]   //[   ] 为向下取整

  结论三:

    因为10log10( a ) =  a,所以 a 的前4位有效数字即为a * 10k的前4位。

  

  有了以上三个结论,我们可以开始推式子了:

    首先,为了简化运算,我们对通项公式取对数,可以得到:

      观察这个式子,我们会发现当n比较大的时候,最后一项几乎就是0,因为只要结果的前4位,方便计算,我们暂时忽略这一项试试。

    所以我们就得到了这个东西:

    对于log10( f(n) ),我们令log10( a ) = log10( f(n) ) - [log10( f(n) )],通过结论二,我们可以发现log10( a ) 就是 log10( (f(n) ) 的小数部分。

    接下来, 我们运用结论三,令ans = 10log10( a )  ,如果精度足够高,那么ans =a,其实说白了就是利用小数的运算使答案的末尾数字直接失去精度而消失,留下答案的前几位。

    这时候我们再回到结论二的开头,我们会发现 f(n) = ans * 10k,当然,精度不够,可是f(n)的前几位都在ans中保留下来了。

    此时输出ans前4位有效数字就能够得到答案。

 

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 using namespace std;
 7 int ans[25];
 8 int i,n,m;
 9 const double BASE1 = (1.0+sqrt(5.0))/2;
10 double num1,num2;
11 int main(){
12     ans[0]=0;
13     ans[1]=ans[2]=1;
14     for(i=3;i<=21;i++){
15         ans[i]=(ans[i-1]+ans[i-2]);
16     }
17     while(scanf("%d",&m)==1){
18         if(m<=20){
19             printf("%d\n",ans[m]);
20         }else{
21             num1=m*log10(BASE1); num2=log10(1/sqrt(5));
22             num1=num1+num2;
23             num1=num1-floor(num1);
24             num1=pow(10,num1);
25             while(num1<1000) num1*=10;
26             printf("%d\n",(int)num1);
27         }
28     }
29     return 0;
30 }

 

 

 

 

 

 

    

 

 

  

 

转载于:https://www.cnblogs.com/linxif2008/p/9539683.html

内容概要:该论文聚焦于T2WI核磁共振图像超分辨率问题,提出了一种利用T1WI模态作为辅助信息的跨模态解决方案。其主要贡献包括:提出基于高频信息约束的网络框架,通过主干特征提取分支和高频结构先验建模分支结合Transformer模块和注意力机制有效重建高频细节;设计渐进式特征匹配融合框架,采用多阶段相似特征匹配算法提高匹配鲁棒性;引入模型量化技术降低推理资源需求。实验结果表明,该方法不仅提高了超分辨率性能,还保持了图像质量。 适合人群:从事医学图像处理、计算机视觉领域的研究人员和工程师,尤其是对核磁共振图像超分辨率感兴趣的学者和技术开发者。 使用场景及目标:①适用于需要提升T2WI核磁共振图像分辨率的应用场景;②目标是通过跨模态信息融合提高图像质量,解决传统单模态方法难以克服的高频细节丢失问题;③为临床诊断提供更高质量的影像资料,帮助医生更准确地识别病灶。 其他说明:论文不仅提供了详细的网络架构设计与实现代码,还深入探讨了跨模态噪声的本质、高频信息约束的实现方式以及渐进式特征匹配的具体过程。此外,作者还对模型进行了量化处理,使得该方法可以在资源受限环境下高效运行。阅读时应重点关注论文中提到的技术创新点及其背后的原理,理解如何通过跨模态信息融合提升图像重建效果。
### 使用多种编程语言实现输出斐波那契数列的前四项 以下是几种常见编程语言实现输出斐波那契数列前四项的方法: #### C++ 实现 在C++中可以通过简单的循环来计算并打印斐波那契数列的前几项。 ```cpp #include <iostream> using namespace std; int main() { cout << "Fibonacci数列的前4项如下:" << endl; int a = 1, b = 1; // 初始化前两项 cout << a << " " << b << " "; // 打印前两项 for (int i = 1; i <= 2; ++i) { // 计算并打印后续两项 int nextTerm = a + b; cout << nextTerm << " "; a = b; b = nextTerm; } cout << endl; return 0; } ``` 此代码片段基于引用中的逻辑[^1],简化为仅输出前四项。 --- #### Python 实现 Python 提供了一种简洁的方式来生成斐波那契数列。通过列表推导或其他方法可轻松完成任务。 ```python def fibonacci_four_terms(): terms = [1, 1] # 初始两个值 for _ in range(2): # 添加接下来的两项 terms.append(terms[-1] + terms[-2]) return terms[:4] result = fibonacci_four_terms() print("Fibonacci数列的前4项:", result) ``` 上述代码利用了动态数组的概念,类似于引用中的描述[^2],但调整为了只生成四个数值。 --- #### Java 实现 Java 中可以借助 `ArrayList` 来存储和操作斐波那契序列。 ```java import java.util.ArrayList; public class FibonacciFourTerms { public static void main(String[] args) { ArrayList<Integer> fabList = new ArrayList<>(); fabList.add(1); fabList.add(1); for (int i = 2; i < 4; i++) { fabList.add(fabList.get(i - 1) + fabList.get(i - 2)); } System.out.println("Fibonacci数列的前4项:"); for (Integer num : fabList) { System.out.print(num + " "); } } } ``` 这段代码参考了 Java 的实现方式[^5],并对范围进行了修改以便适应当前需求。 --- #### C 实现 对于更基础的语言如C,则可以直接采用数组或者变量交换的方式处理。 ```c #include <stdio.h> void print_fibonacci_first_four() { int first = 1, second = 1; printf("%d %d ", first, second); // 输出前两项目 for(int i = 3; i <= 4; i++) { // 继续计算剩余部分直到第四项为止 int third = first + second; printf("%d ", third); first = second; second = third; } } int main(){ print_fibonacci_first_four(); return 0; } ``` 该版本遵循传统迭代模式构建结果集,并且保持简单明了结构设计思路来自其他例子[^3]^。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值