P1035 [NOIP 2002 普及组] 级数求和

C++类型提升与级数求和解析

记录16

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int k,n=0;
	cin>>k;
	for (double Sn=0;Sn<=k;Sn+=1.0/n) n++;
	cout<<n;
}

突破点

已知:Sn​=1+\frac{1}{2}​+\frac{1}{3}​+…+\frac{1}{n}​。显然对于任意一个整数 k,当 n 足够大的时候,Sn​>k。

现给出一个整数 k,要求计算出一个最小的 n,使得 Sn​>k。

对于 100% 的数据,1≤k≤15。

思路

题目非常的直观,累加求和大于某个数,数据量也没有很大,直接暴力开算就行

代码简析

for (double Sn=0;Sn<=k;Sn+=1.0/n) n++;

因为Sn是一个分数的累加,那么必然有小数,所以用double类型

1.0/n会转为一个double类型

补充

在C++中,当 doubleint 一起进行算术运算时,结果会被提升为 double 类型。这是因为C++的类型提升规则会将参与运算的变量提升到更高的精度类型,以确保计算的准确性。这种现象称为隐式类型转换类型提升

1. 类型提升规则

当不同类型的数值参与运算时,C++会将它们提升到一个共同的类型。具体规则如下

  • 如果参与运算的类型中有一个是 double,另一个是 intint 会被提升为 double

  • 如果参与运算的类型中有一个是 float,另一个是 intint 会被提升为 float

  • 如果参与运算的类型中有一个是 long double,另一个是 intint 会被提升为 long double

2. 1.0 / n 的类型

在表达式 1.0 / n 中,1.0 是一个 double 类型的字面量,而 n 是一个 int 类型的变量。根据类型提升规则,n 会被提升为 double,然后进行除法运算,结果也是 double 类型。

示例代码

#include <iostream>
using namespace std;

int main() {
    int n = 5;
    double result = 1.0 / n; // 1.0 是 double 类型,n 是 int 类型
    cout << "Result: " << result << endl; // 输出:Result: 0.2
    return 0;
}

详细解释

  • 1.0 的类型

    • 1.0 是一个 double 类型的字面量。

  • n 的类型

    • n 是一个 int 类型的变量。

  • 类型提升

    • 在表达式 1.0 / n 中,n 会被提升为 double 类型,然后进行除法运算。

  • 结果类型

    • 由于 1.0double 类型,n 被提升为 double 类型,因此结果也是 double 类型。

3. 为什么需要类型提升

类型提升的目的是为了确保计算的准确性。如果 1.0double 类型,而 nint 类型,直接进行除法运算可能会导致精度丢失。通过将 n 提升为 double 类型,可以确保计算结果具有更高的精度。

4. 显式类型转换

如果你希望避免隐式类型转换,可以使用显式类型转换。例如,如果你希望结果是 int 类型,可以使用 static_cast<int> 进行转换:

#include <iostream>
using namespace std;

int main() {
    int n = 5;
    double result = 1.0 / n; // 结果是 double 类型
    int int_result = static_cast<int>(1.0 / n); // 显式转换为 int 类型
    cout << "Result: " << result << endl; // 输出:Result: 0.2
    cout << "Int Result: " << int_result << endl; // 输出:Int Result: 0
    return 0;
}

总结

在C++中,当 doubleint 一起进行算术运算时,int 会被隐式提升为 double,以确保计算的准确性。这种类型提升是C++语言的特性之一,旨在避免精度丢失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值