目前主要分为三个专栏,后续还会添加:
专栏如下: C语言刷题解析 C语言系列文章 我的成长经历
感谢阅读!
初来乍到,如有错误请指出,感谢!
描述
这次牛牛又换了个数列,他想计算:1+1/2+1/3+…+1/N的值。(保留6位小数)
输入描述:
输入一个整数,范围在0到1000
输出描述:
输出一个浮点数
思路 :
理解题目要求:题目要求计算数列 1+1/2+1/3+…+1/N 的和,其中 N 是一个整数,范围是 0 到 1000。结果需要保留六位小数。
输入处理:读取用户输入的整数 𝑁。
循环计算:使用一个循环从 11 到 𝑁(包括 𝑁),累加每一项 1 / i。
精度控制:由于题目要求保留六位小数,我们需要在累加过程中就注意精度问题,避免因为浮点数的精度问题导致结果不准确。
输出结果:将计算得到的和转换为字符串格式,确保小数点后有六位数字,然后输出。
- 在C语言中,
scanf
用于读取输入,printf
用于格式化输出。 - 循环中的
1.0 / i
确保了除法操作的结果是一个浮点数,避免了整数除法的问题。 printf
中的%.6f
格式化输出确保了结果保留六位小数。
代码 1 :
int main()
{int a = 0;double c = 0;scanf("%d", &a);for (int b = 1; b <= a; b++){c = 1.0 / b + c;}printf("%.6lf", c);return 0;
}
代码 2:
#include <stdio.h> // 引入标准输入输出库int main() // 主函数的开始
{double i = 1; // 定义一个变量i,表示分子,初始值为1double n = 0; // 定义一个变量n,用于存放用户输入的整数,初始值为0double j = 0; // 定义一个变量j,用于for循环的迭代,初始值为0double sum = 0; // 定义一个变量sum,用于累加求和,初始值为0scanf("%lf", &n); // 从标准输入读取一个浮点数,存储在变量n中if (n == 1) // 如果输入的n等于1{printf("1\n"); // 输出1,因为1+1/2+...+1/1的和就是1}else if (n > 0 && n <= 1000) // 如果输入的n大于0且小于等于1000{for (j = 1; j <= n; j++) // 使用for循环,从1迭代到n{sum = (i / j) + sum; // 计算每一项1/j,并加到sum上}printf("%.6lf\n", sum); // 输出累加和sum,保留六位小数}else // 如果输入的n不满足条件(即n为负数或大于1000){printf("输入错误\n"); // 输出错误信息}return 0; // 返回0,表示程序正常结束
}//改进后的:
#include <stdio.h>int main()
{double n = 0; // 用户输入double sum = 0; // 用于累加的变量,初始化为0scanf("%lf", &n); // 读取用户输入的整数if (n == 1) {printf("1\n"); // 如果输入的n为1,直接输出1} else if (n > 0 && n <= 1000) {for (double j = 1; j <= n; j++) { // 开始for循环,从1到nsum += 1.0 / j; // 直接使用1.0作为分子,累加到sum上}printf("%.6lf\n", sum); // 输出累加和sum,保留六位小数} else {printf("输入错误\n"); // 如果输入的n不满足条件,输出错误信息}return 0; // 程序正常结束
}/*在这个修改后的版本中,我去掉了 double i = 1;
这行代码,因为不需要单独定义一个变量来表示分子。
在 for 循环中,直接使用 1.0 / j 来进行计算,
其中 1.0 表示分子,j 表示分母。
这样代码更为简洁,并且避免了不必要的变量定义。*/
代码 3 :
#include <stdio.h>int main() {int N;double sum = 0.0; // 用于累加的变量,初始化为0.0// 读取输入scanf("%d", &N);// 循环计算数列和for (int i = 1; i <= N; ++i) {sum += 1.0 / i; // 注意这里1.0是双精度浮点数,以确保除法结果是浮点数}// 保留小数点后六位,使用printf的格式化输出来实现printf("%.6f\n", sum);return 0;
}
知识点 :
浮点数精度:在C语言中,涉及到小数的计算时,需要使用浮点数类型,如 float
或 double
。由于题目要求保留六位小数,使用 double
类型可以提供足够的精度。
输入验证:在读取用户输入后,应进行验证以确保输入值在题目要求的范围内(0到1000)。如果不在这个范围内,应提示用户输入错误。
循环控制:使用 for
循环来遍历从1到N(包括N)的整数,并计算每一项的和。
累加求和:在循环中,需要将每一项 1.0 / j
加到累加器 sum
上。注意这里使用 1.0
而不是 1
,因为 1.0
是一个 double
类型的值,这样可以确保除法操作的结果是一个浮点数。
格式化输出:使用 printf
函数的格式化输出 %.6lf
来控制输出的精度,保留小数点后六位。
条件语句:使用 if
或 else if
语句来处理不同的输入情况,如输入为1时的特殊情况,或者输入不符合要求时的错误提示。
变量初始化:在开始计算之前,应确保所有变量(如累加器 sum
)已经被初始化,以避免使用未初始化的变量。
整数与浮点数的除法:在C语言中,当两个操作数都是整数时,除法结果也是整数。因此,至少有一个操作数必须是浮点数,以进行浮点除法。
代码风格:保持代码的可读性,使用适当的变量命名,添加注释来解释代码的功能。
资源限制:注意题目中提到的时间限制和空间限制,确保算法的效率。
四舍五入:题目要求结果保留六位小数,这意味着需要进行四舍五入处理,C语言标准库中 printf
函数可以直接完成这个任务。