HDOJ-2009

目录

A.题解

B.%.2f和%.2lf的区别


A.题解

作为学习过数列的一名学生,看到这种题自然而然地就会想引入一个数组,来存放每一项的值 

这是采用数组的写法:

#include <stdio.h>
#include <math.h>
int main()
{
	int m,n;
	double sum;
	while(scanf("%d",&n))
	{
		double arr[n];                   //sqrt(n)的值会包含小数
		scanf("%d",&m);
		if(n<10000 && m<1000)            //给定范围
		{
			arr[0] = n;                  //数组首项为n 
			sum = n;                     
			for(int i = 1;i<m;i++)       //从数组第二项开始输入各项的值 
			{
				arr[i] = sqrt(arr[i-1]); 
				sum += arr[i];           //前面已经定义sum=n=arr[0]
			}
		}else{
			printf("输入的数据有误!\n");
		}
		printf("%.2f\n",sum);
	}
	return 0;
}

在上面的代码中我们发现:

arr[i]的某一项的生命周期仅仅是在一个for循环中,所以完全可以引入其他的变量来代替数组

这是不采用数组的写法:

#include <stdio.h> 
#include <math.h>
int main()
{
	int m,n;
	float sum;
	
	while(scanf(" %d %d",&m,&n))
	{
		sum = n;
		float temp = n;             //这里引入double变量是因为n是int型数据
                                    //不引入temp没法保留sqrt(n)的结果
		for(int i = 1;i<m;i++)
		{
			temp = sqrt(temp);      //实际上temp就是替代了数组中的每一项
			sum += temp;
		}
		printf("%.2f\n",sum);
	}
	
	return 0;
}

B.%.2f和%.2lf的区别

下面介绍一下%.2f和%.2lf的区别:

%.2f表示输出的变量为浮点数,即float变量

%.2lf表示输出的变量为双精度变量,即double变量

虽然用%.2f来输出double变量、用%.2lf来输出float变量编译器均不会报错,且能够得出正确结果

但要注意:

float变量在内存中占用四个字节,因为有一位数字来表示正负,所以只能提供七位有效数字

而double占用8个字节,可以提供16位有效数字

#include <stdio.h> 
int main()
{
	float m = 1.555555555555555;
	double n = 1.555555555555555555555555;
	
	printf("%f %lf",m,n);
	return 0;
}
//输出结果
1.555556 1.555556
--------------------------------
Process exited after 0.02151 seconds with return value 0
请按任意键继续. . .

但是在我的dev c++上,二者默认都是只能表示七位有效数字

但是他们的精度仍然不相同:

你可以要求double显示16位有效数字,但float的精度仍然限制,不能够显示那么多有效数字

#include <stdio.h> 
int main()
{
	float m = 1.555555555555555;
	double n = 1.555555555555555555555555;
	
	printf("%.7f %.16f",m,n);
	return 0;
}

//运行结果
1.5555556 1.5555555555555556
--------------------------------
Process exited after 0.01942 seconds with return value 0
请按任意键继续. . .

这时结果均是正确的

当超过他们所能显示的最大精度时,必然会出现错误

#include <stdio.h> 
int main()
{
	float m = 1.555555555555555;
	double n = 1.555555555555555555555555;
	
	printf("%.8f %.17f",m,n);
	return 0;
}

//运行结果
1.55555558 1.55555555555555560
--------------------------------
Process exited after 0.02098 seconds with return value 0
请按任意键继续. . .


所以不管默认显示多少位有效数字,float和double仍然有本质上的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Crkylin

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值