目录
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仍然有本质上的区别