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
问题
相信大家对于编程求和没什么问题,但是对输入输出的小细节会有些烦恼,编程过程中我遇到了以下两个问题
- 连续输入输出,输入0 0 则退出输入
- 溢出问题, 输入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; 来解决该问题。
运行结果
最后祝大家学习进步,工作顺利,身体健康!!!