做网站会提供源代码吗,朝阳网站制作设计,物联网公司排名国内,网站备案是域名备案还是主机备案【题目描述】
输入两个正整数#xff0c;输出#xff0c;保留5位小数。输入包含多组数据#xff0c;结束标记为n#xff1d;m#xff1d;0。提示#xff1a;本题有陷阱。
【样例输入】
2 4
65536 655360
0 0
【样例输出】
Case 1: 0.42361
Case 2: 0.00001
【题…【题目描述】
输入两个正整数输出保留5位小数。输入包含多组数据结束标记为nm0。提示本题有陷阱。
【样例输入】
2 4
65536 655360
0 0
【样例输出】
Case 1: 0.42361
Case 2: 0.00001
【题目来源】
刘汝佳《算法竞赛入门经典 第2版》习题2-4 子序列的和subsequence 【解析】
#includestdio.h
int main(){int n, m, kase0;while(scanf(%d%d, n, m)2 0!n 0!m){ double sum 0;for(int in; im; i){ sum 1.0/i/i;}printf(Case %d: %.5f\n, kase, sum);}return 0;
}
本题的陷阱有三个
(1)数据类型转换输入的n、m为整数而输出的结果为小数需要转换数据类型所以sum 1.0/i/i中的1.0不能写成1。
(2)输出格式问题输出格式要与样例严格一致如Case和数字之间、冒号与输出值之间有且只有一个空格。为避免出错最好将样例直接复制到代码中。
(3)数据超限问题估计这就是题中所指的陷阱。因为题目所给数据范围为而int型的最大值约为因此代码如果写成sum 1.0/(i*i)大数相乘就会导致数据超限。当然这个问题也可以通过将int型改为long long型解决。
此外上面的代码有两处写得不够简明
(1)变量不为0的判断代码中用0!n的形式不够简明它其实等价于n。
(2)从n到m的遍历不用引入第3个变量直接用n自加即可。
优化后的代码
#includestdio.h
int main(){int n, m, kase0;while(scanf(%d%d, n, m)2 n m){double sum 0;for(;nm; n){sum 1.0/n/n;}printf(Case %d: %.5f\n, kase, sum);}return 0;
}