题目描述:
小明最近痴迷于斐波那契数列(1,1,2,3,5……),但是最近他又有了新的奇思妙想,就是对于斐波那契数列的相邻的两个数相乘取倒数然后将每一项进行相加,由于小明只喜欢思考不喜欢动手,所以现在他想让你帮他算下这样一个新的数列的前13项的和为多少?(结果用分数表示,且保留最简分数)
输入描述:
无
输出描述:
无
备注:
例如前三项:1/(1*1)+1/(1*2)+1/(2*3)=5/3
思路:
根据题意模拟过程,注意结果会很大,每次计算之前都要对分子分母通分,防止数据溢出。或者使用 __int128或者JAVA的大数来计算。
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
typedef __int128 lll;
lll f(lll n){
if(n == 0){
return 1;
}
if(n==1){
return 1;
}
return f(n-1)+f(n-2);
}
void print(lll x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9) print(x/10);
putchar(x%10+'0');
}
int main(){
lll a=0,b=1;
for(lll i=0;i<13;i++){
b*=f(i)*f(i+1);
}
for(lll i=0;i<13;i++){
a+=b/(f(i)*f(i+1));
}
lll f = __gcd(a,b);
a /= f;
b /= f;
print(a);
cout<<'/';
print(b);
}
注意:
1、__int128无法编译通过(可以先用long long测试程序)
2、print()函数有讲究(将__int128类型数据一位一位地转换成字符型输出)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/103324.html