目录
题目描述
已知:。显然对于任意一个整数
,当
足够大的时候,
。
现给出一个整数 ,要求计算出一个最小的
,使得
。
题目链接:P1035 [NOIP2002 普及组] 级数求和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
输入格式
一个正整数 。
输出格式
一个正整数 。
解题步骤
- 输入数据
- 求和
并判断,当满足
时退出
- 输出结果
解题代码
C代码
//头文件
//stdio.h:对应C中的输入输出函数的宏,i表示input(输入),o表示output(输出)
#include<stdio.h>
int main()//int表示返回值类型,int表示返回整形,void表示啥都不返回等
{
int k;//定义输入变量k
scanf("%d",&k);//输入数据k,记得一定要加取地址符&(字符串输入除外,没学字符串的可以先暂时不管)
double sum = 0;//定义sum为和,一定是double类型
int i = 0;//定义i为分母
while(sum <= k){//sum > k时跳出循环
i++;//由于i初始数据为0,因此先i先加一再进行求和
sum += (1.0/i);//如果只有两个整数相除,将得到整数,即自动去掉小数部分;如果两个数中有一个是浮点数,将会把整数转变成浮点数后再进行运算,即得到浮点数
}
printf("%d",i);//输出答案
return 0;
}
C++代码
//头文件:#include<iostream>定义了一些重要的类和对象,以及输入输出
#include<iostream>
//如果没有using namespace std,会报会报未声明变量cout和未声明变量endl,建议大家写的时候都加上
using namespace std;
//int main:int表示返回值类型为整形
int main()
{
int k,i = 1;//k表示输入的整数,i表示求和的过程
double sum = 0;//定义累加和,数据类型为double类型(高精度浮点数类型),并且要将初值赋值为0,不然会报错
cin>>k;//输入k
while(1){
sum += (double)1 / i; //累加1/i,要进行数据类型强制转换
if(sum > k) break; //当满足累加和大于输入的值,跳出循环
i++; //每次循环对i+1
}
cout<<i;
return 0;
}
Java代码
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
int i = 1;
double sum = 0;//记录求和后的结果
boolean flag = true;
while(flag){//当满足题意时跳出循环
sum += (double)1/i;//求和并强制转换为double型
if(sum > t) break;//满足题意,跳出循环
i ++;
}
System.out.println(i);
}
}
补充知识
除法问题
//当‘/’两边都是整数时,即整数与整数相除,将自动去掉小数部分,得到的结果为整数
int result = 10 / 3;
printf("整除结果为:%d\n", result);
//上述将会输出3
//当‘/’有浮点数时(即float、double类型),则将会得到浮点数类型,即小数
double result = 0.5 / 3;//将会得到3.5
//如果想要得到的结果变成整数的话,可以使用强制转换,即在表达式前面加上括号()并写上转换后的数据类型
int result = (int)(10.5 / 3);
printf("整除结果为:%d\n", result);
//上述将会输出3,因为10.5 / 3 = 3.5,使用强转后去掉小数部分变成3