题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前 20 项之和

博客给出一个分数序列,如2/1,3/2等,使用Java语言实现求出该数列前20项之和。代码中通过循环和变量交换来计算每一项的值并累加,最后输出求和结果。

package test1;

/**

  • 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…
  • 求出这个数列的前 20 项之和

*/
分析:
在这里插入图片描述
public class Test1 {
//如果此处需要次数为n的话可自行添加Scanner 获取用户输入的n值这道题是前20项
public static void main(String[] args) {
int x = 2, y = 1, temp;
double sum = 0;
for (int i = 1; i <=20; i++) {
sum = sum + (double) x / y;
temp = y;
y = x;
x = y + temp;
}
System.out.println(“前20个数相加的合为:” + sum);
}
}
运行结果:
在这里插入图片描述

<think>题目要求计算个特定数列20之和。这个数列是:2/1,3/2,5/3,8/5,13/8,21/13,...观察数列,我们可以发现:分子:2,3,5,8,13,21,...从第三开始,每的分子等于分子之和(斐波那契数列的特征)分母:1,2,3,5,8,13,...同样的规律,从第三开始,每的分母等于分母之和。实际上,分子和分母都是斐波那契数列的变形。具体来说:分子:可以看作斐波那契数列从第三开始(斐波那契数列通常定义为:F(1)=1,F(2)=1,F(3)=2,F(4)=3,F(5)=5,...)但这里分子是:2,3,5,8...即从斐波那契数列的第3到第22(因为20,所以分子需要20个,分母也是20个,分母从斐波那契的第2开始?)然而,我们也可以换种方式:直接观察分子分母的递推关系。设第n为a_n/b_n,则:a1=2,b1=1a2=3,b2=2a3=a1+a2=5,b3=b1+b2=3a4=a2+a3=8,b4=b2+b3=5...所以,从第三开始,每的分子等于分子之和,分母等于分母之和。因此,我们可以用循环来计算20的和。由于已经给出,我们可以从第三开始循环到第20。步骤:1.初始化:a1=2,b1=1;a2=3,b2=2。同时,的和为:2/1+3/22.从第三开始循环(循环18次),每次计算新的分子和分母,并累加到总和。3.新的分子=分子+分子,新的分母=分母+分母。但是注意,我们需要保存的值,并且在循环中更新。我们可以用两个变量来保存的分子和分母,然后在循环中更新。另种方法是:我们使用两个变量来分别表示的分子分母,然后循环20次(包括),这样代码更简洁。我们可以这样:设sum=0设a1=2,b1=1//第设a2=3,b2=2//第二但是,如果我们从第开始循环,那么我们需要在循环中计算下。我们可以用两个变量来保存当。更简洁的方法:使用两个数组分别存储分子和分母,但题目要求20,所以数组大小20。但也可以不用数组。这里我们使用循环迭代,每次计算当,然后更新的值。具体步骤:初始化:sum=0a1=2,b1=1//第的分子和分母a2=3,b2=2//第二的分子和分母先将第和第二加到sum中:sum+=(a1/b1)+(a2/b2)然后从第三开始(即i=3到i<=20):分子:a=a1+a2分母:b=b1+b2的值:a/b,加到sum然后更新:将a2,b2赋值给a1,b1;将a,b赋值给a2,b2,以便下次迭代注意:由于我们使用浮点数计算,所以分子分母应该用浮点数类型,避免整数除法丢失精度。但是,题目要求用C语言,所以我们可以用double类型。代码实现如下:</think>以下是使用C语言计算给定分数序列20之和的解决方案: ```c #include <stdio.h> int main() { double numerator = 2.0; // 分子初始值 double denominator = 1.0; // 分母初始值 double sum = 0.0; // 总和 double temp; // 临时变量用于交换 for (int i = 0; i < 20; i++) { sum += numerator / denominator; // 累加当 // 计算下:分子变为当分子+分母,分母变为当分子 temp = numerator; numerator = numerator + denominator; denominator = temp; } printf("数列20之和: %.10f\n", sum); return 0; } ``` ### 代码解释: 1. **数列规律**: - 分子序列2, 3, 5, 8, 13...(从第2起,每个分子 = 分子 + 分母) - 分母序列:1, 2, 3, 5, 8...(每个分母 = 的分子) - 递推关系:`next_numerator = current_numerator + current_denominator` `next_denominator = current_numerator` 2. **变量说明**: - `numerator`:当的分子(初始为2.0) - `denominator`:当的分母(初始为1.0) - `sum`:累加和(初始为0.0) - `temp`:临时保存当分子用于更新分母 3. **循环逻辑**: - 循环20次(`i=0`到`i=19`) - 每次循环: - 累加当:`sum += numerator / denominator` - 计算下: ```c temp = numerator; // 保存当分子 numerator = numerator + denominator; // 新分子 = 当分子 + 当分母 denominator = temp; // 新分母 = 原分子(保存在temp中) ``` 4. **输出结果**: - 使用`printf`输出浮点数结果,保留10位小数(`%.10f`) ### 执行结果: ``` 数列20之和: 32.6602607986 ``` ### 算法特点: - **时间复杂度**:O(n),只需20次的循环 - **空间复杂度**:O(1),仅使用固定数量的变量 - **精度处理**:使用`double`类型确保计算精度,避免整数除法截断
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值