子序列的和

C语言编程小问题(1)——子序列的和(subsequence)

最近在学习关于C语言编程算法的知识,过程中遇到了不少困难,写这篇博客是希望将遇到的一些问题总结出来,给初学者们一些帮助。

题目

输入两个正整数 n < m < 1 0 6 n<m<10^{6} n<m<106输出 1 / n 2 + 1 / ( n + 1 ) 2 + . . . + 1 / m 2 1/n^{2}+1/(n+1)^{2}+...+1/m^{2} 1/n2+1/(n+1)2+...+1/m2,保留5位小数。输入包含多组数据,结束标记为n=m=0。提示:本题有陷阱。

样例输入:
2 4
65536 655360
0 0

样例输出:
Case 1: 0.42361
Case 2: 0.00001

问题

相信大家对于编程求和没什么问题,但是对输入输出的小细节会有些烦恼,编程过程中我遇到了以下两个问题

  1. 连续输入输出,输入0 0 则退出输入
  2. 溢出问题, 输入65536 655360时 输出显示1.#INF0

话不多说,先给大家上代码,如果有更好的办法还望指正。

代码

#include <stdio.h>
int main(){
	int m,n,k=1;
	while(scanf("%d",&n)==1&&n){
		scanf("%d",&m);
		int i;
		long double temp=0;
		for(i=n;i<=m;i++){
			//temp += 1.0/(i*i);
			temp  += 1.0/i/i;	
		}
		printf("Case %d: %.5f",k,temp);
		k++;
	}
return 0;
}

解读

1.关于连续输入输出问题
之前看了很多博客都是通过while(1)循环来实现连续输入的,我觉得这样的方式并不能很好的切合题目要求,这里我使用=while(scanf("%d",&n)==1&&n)来实现连续输入,当输入一组数据的第一个数字(且不为0)时,进入循环,在循环语句中给第二个数字赋值。这样就实现了连续输入的效果;当一组数据的第一个数字为0时,则无法进入while循环语句,实现退出的效果。
2.关于溢出问题
当使用 temp += 1.0/(i * i)来进行求和,数字过大时,i*i 会造成数据的溢出,程序运行结果会出现1.#INF0的问题,这里我使用temp += 1.0/i/i; 来解决该问题。

运行结果

在这里插入图片描述
最后祝大家学习进步,工作顺利,身体健康!!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值