隐藏在计算过程中的数据超限

【题目描述】

输入两个正整数,输出,保留5位小数。输入包含多组数据,结束标记为n=m=0。提示:本题有陷阱。

【样例输入】

2 4

65536 655360

0 0

【样例输出】

Case 1: 0.42361

Case 2: 0.00001

【题目来源】

刘汝佳《算法竞赛入门经典  第2版》习题2-4 子序列的和(subsequence)

【解析】

#include<stdio.h>
int main(){int n, m, kase=0;while(scanf("%d%d", &n, &m)==2 && 0!=n && 0!=m){ double sum = 0;for(int i=n; i<=m; 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自加即可。

优化后的代码:

#include<stdio.h>
int main(){int n, m, kase=0;while(scanf("%d%d", &n, &m)==2 && n && m){double sum = 0;for(;n<=m; n++){sum += 1.0/n/n;}printf("Case %d: %.5f\n", ++kase, sum);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/601458.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第四百四十七回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 使用方法 3. 内容总结 我们在上一章回中介绍了"如何在页面上显示蒙板层"相关的内容&#xff0c;本章回中将介绍overlay_tooltip这个三方包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…

代码审计sql注入部分函数绕过方法

目录 1.宽字节注入 2.预编译模式下的sql注入 3无法预编译的 1.3.1. like关键字 1.3.2.不能加单引号 4.相关实战实战 4.1.某个业务网站具有sql注入 4.2.梦想cms代码审计 5.相关参考资料 1.宽字节注入 <?php $dbinit_db(); $db->query("set SET NAMESgbk);…

手机基带电路设计20问(1)

原文来自微信公众号&#xff1a;工程师看海&#xff0c;与我联系&#xff1a;chunhou0820 看海原创视频教程&#xff1a;《运放秘籍》 大家好&#xff0c;我是工程师看海&#xff0c;原创文章欢迎点赞分享&#xff01; 1 小电压和小电流供电是不是可以减小大部分功耗&#xff1…

【电路笔记】-逻辑与非门

逻辑与非门 文章目录 逻辑与非门1、概述2、晶体管与非门3、数字逻辑与非门4、通用与非门逻辑与非门是数字逻辑与门和非门串联的组合。 1、概述 NAND(非与)门的输出通常处于逻辑电平“1”,并且仅当其所有输入都处于逻辑电平“1”时才变为“低”至逻辑电平“0”。 逻辑与非门…

入门Arduino与Esp8266:一步步教你点亮LED灯

文章目录 一、前言二、下载与安装Arduino1. 通过输入网址&#xff1a;Arduino.cc进行下载2. 点击上面的SOFTWARE软件选项3. 选择右边的Windows版本进行下载4. Just Download 立即下载4. 正在下载&#xff0c;请稍等5. 下载完成6. 双击开始安装&#xff0c;单击我同意许可证协议…

二分查找 -- 力扣(LeetCode)第704题

题目 https://leetcode.cn/problems/binary-search/description/ 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例…

Ubuntu 20.04.06 PCL C++学习记录(十六)

[TOC]PCL中点云分割模块的学习 学习背景 参考书籍&#xff1a;《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,&#xff0c;PCL版本为1.10.0&#xff0c;CMake版本为3.16 学习内容 用一组点云数据做简单的平面的分割 源代码及所用函数 源代码 #include<iostr…

IDEA中修改git的作者、邮箱名称

目录 一、查看当前git信息 1、查看git作者名称 如下图&#xff1a; 2、查看git邮箱信息 二、修改git信息 1、修改git作者名称 如下图&#xff1a; 2、修改git邮箱名称 一、查看当前git信息 1、查看git作者名称 在git控制台 或者 Terminal 输入 git config user.name …

如何高效学习Python编程语言

理解Python的应用场景 不同的编程语言有不同的发展历史和应用场景,了解Python主要应用在哪些领域对于学习它会有很大帮助。Python最初是一种通用脚本语言,主要用于系统级任务自动化。随着时间的推移,它逐步成为数据处理、科学计算、Web开发、自动化运维等众多领域的主要编程语…

【多线程】多线程下使用集合类

一.Java中线程安全的集合类 Java中提供了多种线程安全的集合类&#xff0c;它们可以在多线程环境下安全地被多个线程同时访问而无需外部同步。以下是一些常见的线程安全集合类&#xff1a; Vector: 类似于 ArrayList 的动态数组&#xff0c;但是所有方法都是同步的&#xff0…

lottery-攻防世界

题目 flag在这里要用钱买&#xff0c;这是个赌博网站。注册个账号&#xff0c;然后输入七位数字&#xff0c;中奖会得到相应奖励。 githacker获取网站源码 &#xff0c;但是找到了flag文件但是没用。 bp 抓包发现api.php&#xff0c;并且出现我们的输入数字。 根据题目给的附…

跨越网络边界:借助C++编写的下载器程序,轻松获取Amazon商品信息

背景介绍 在数字化时代&#xff0c;数据是新的石油。企业和开发者都在寻找高效的方法来收集和分析网络上的信息。亚马逊&#xff0c;作为全球最大的电子商务平台之一&#xff0c;拥有丰富的商品信息&#xff0c;这对于市场分析和竞争情报来说是一个宝贵的资源。 问题陈述 然…