1008: 级数求和(附:在使用for循环里的表达式二进行判断时的注意事项【两种求解方法】)

本文针对NOIP2002的一道数列求和问题进行了解析,给出了两种不同的C语言实现方案,通过迭代计算使数列和大于给定整数K时所需的最小项数N。

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

题目描述

已知:Sn= 1+1/2+1/3+…+1/n。显然对于任意一个整数K,当n足够大的时候,Sn大于K。
现给出一个整数K(1<=k<=15),要求计算出一个最小的n;使得Sn>K。

输入

键盘输入 k

输出

屏幕输出 n

样例输入

1

样例输出

2

提示

来源

NOIP2002


代码示例一:

#include<stdio.h>
int main()
{
    double s=0,k,n;
    scanf("%lf",&k);
    for(n=1;s<=k;n++)//注意:当for循环中的表达式二(s<=k)执行之,
    {                //不论表达式二的值为真还是假,都会去执行表达式三(n++)
        s=s+1/n;
    }
    printf("%.0lf",n-1);//因此最后应将n-1才是需要的结果(因为在for循环体的表达式列表里进行判断,并且判断结果为假之后多加了一次嘛!)
}


代码示例二:我们也可以不用for循环的表达式二进行判断,在for循环中再加一个判断语句,虽然这样显得麻烦一点儿,但是理解起来要简单一点儿,当然如果你会调试代码并且会单步追踪程序代码执行结果的话,那也可以使用代码示例一,多追踪几遍,看看程序如何运行的。

#include<stdio.h>
int main()
{
    double s=0,k,n;
    scanf("%lf",&k);
    for(n=1;;n++)
    {
        s=s+1/n;
        if(s>k)
        {
            break;
        }
    }
    printf("%.0lf",n);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

COCO56(徐可可)

建议微信红包:xucoco56

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值