20240321每日一题题解

20240321每日一题题解

Problem

已知 f(x,n)=n+(n1)+(n2)+...+2+1+x

计算 f 的值。

输入 xn​。输出这个函数值,并且注意需要保留两位小数。

例如,输入4.2 10,则应该输出3.68

Solution

递归?循环?

说实话这道题是有一定思考量的,初看可能会无从下手。

f(x,1)=1+xf(x,2)=2+1+x=2+f(x,1)f(x,3)=3+2+1+x=3+f(x,2)=3+2+f(x,1)...

可以得出普遍结论:

f(x,n)=n+f(x,n1)

如此,就可以依照我们昨天的递归来解决了。


当然,也可以用循环解决这道题。

我们从内部向外剖析:

f(x,n)=n+(n1)+(n2)+...+2+1+x

这个函数的最内层是1+x,而后再给1+x加上了2,再套了根号;再加上了3,再套了根号;再加上了4,再套了根号;……;再加上了(n1),再套了根号;再加上了n​,再套了根号。

所以可以用写成for循环的格式,每次给答案执行+i再套根号,边界是i<=n

保留两位小数

c++中有两种保留两位小数的方法,分别是给coutprintf使用的。

虽然老师上课说printfc的,其实c++中依然可以使用printf,其在头文件cstdio当中,完完全全可以正常使用。我认为其也是c++不可或缺的一部分。

cout

默认情况下,cout使用 6 个有效数显示浮点值,其余自动四舍五入,有后缀0则会自动舍去。

使用 cout<<fixed<<setprecision(2)来控制接下来输出的小数位数,括号里是几就保留几位小数。

这个函数在头文件#include<iomanip>中。

printf

这个可以类比python中的%格式符:

printf("%.2lf\n",f(x,n));表示保留小数点后两位。

Code

递归写法

#include<iostream>
#include<cmath>//使用sqrt
#include<iomanip>//cout的setprecision控制小数位数
#include<cstdio>//使用printf
using namespace std;

double f(double x,int n)
{
	if(n==1)
	{
		return sqrt(1+x);
	}
	return sqrt(n+f(x,n-1));
}

int main()
{
	double x;
	int n;
	cin>>x>>n;
	cout<<fixed<<setprecision(2)<<f(x,n)<<endl;
//	printf("%.2lf\n",f(x,n));
	return 0;
}

循环写法

#include<iostream>
#include<cmath>//使用sqrt
#include<iomanip>//cout的setprecision控制小数位数
#include<cstdio>//使用printf
using namespace std;

int main()
{
	double x;
	int n;
	cin>>x>>n;
	double ans=x;
	for(int i=1;i<=n;i++)
	{
		ans=sqrt(i+ans);
	}
	
	cout<<fixed<<setprecision(2)<<ans<<endl;
//	printf("%.2lf\n",f(x,n));
	return 0;
}

AC

posted @   Vanilla_chan  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示