HDU2009求数列的和

HDU2009求数列的和

Problem Description
数列的定义如下:
数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。

Input
输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述。

Output
对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。

Sample Input
81 4
2 2

Sample Output
94.73
3.41

代码如下

/*
	Input
	数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。
	输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述。

	Output
	对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。
	81 4
	2 2

	94.73
	3.41

  9+3+81+
*/
#include<stdio.h>
#include<math.h>
int main()
{
	double m=0;
	int n=0;
	double sum;
	int i=0;
	while(~scanf("%lf %d",&m,&n))//需要一个判断结束的条件
	{
		sum=0.00;
		for(i=0;i<n;i++)
		{
			sum+=m;
			m=sqrt(m);
		}
		printf("%0.2lf\n",sum);
	}
	return 0;
}

本题收获

while(~scanf("%lf %d",&m,&n))
其功能是循环从输入流读取m和n,直到遇到EOF为止,等同于while (scanf("%d%d",&m,&n)!=EOF)。

scanf()函数返回成功赋值的数据项数,出错时则返回EOF,定义为-1。~是按位取反,-1十六进制补码表示为0x
ffffffff,f是二进制的1111,取反后就全部变成0了,于是while结束。只有返回值为EOF(即-1)时,其取反的的值(即while循环的判断条件)才为0,才能结束循环,其它输入情况下(无论是否输入成功)while循环的判断条件为非0,即为真。

这种写法的漏洞在于:一但输入的值为字母、符号之类的,scanf赋值不成功把读到的内容又返回到stdin的缓冲区(假设这个值为t),其取反得到的值使while又进入到下一次循环,scanf又从stdin缓冲区里读到了原先吐回的t,如此成了死循环。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值