当不应该使用整数和双精度数时会给出不同的答案

2024-04-07

我正在解决欧拉项目问题14 https://projecteuler.net/problem=14使用java。我并不是寻求帮助解决问题。我已经解决了,但我遇到了一些我无法弄清楚的事情。

问题是这样的:

为正集合定义以下迭代序列 整数:

n = n/2,如果 n 是偶数
n = 3n + 1,如果 n 是奇数

使用上面的规则并从 13 开始,我们生成以下内容 顺序:

13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1。这里,链的长度是10个数字。

找出 1,000,000 以下的起始数字,从而产生最长的链。

所以我写了这段代码:

public class Euler014 {
    public static void main(String[] args){
        int maxChainCount = 0;
        int answer = 0;
        int n;
        int chainCount = 1;

        for(int i = 0; i < 1000000; i++){
            n = i;
            while(n > 1){
                if(n%2 == 0){       //check if even
                    n /= 2;
                }else{              //else: odd
                    n = 3*n + 1;
                }
                chainCount++;
            }
            if(chainCount > maxChainCount){ //check if it's the longest chain so far
                maxChainCount = chainCount;
                answer = i;
            }
            chainCount = 1;
        }       
        System.out.println("\n\nLongest chain: i = " + answer);     
    }
}

这给了我答案 910107,这是错误的。

但是,如果我将 n 变量的类型更改为double n它运行并给出答案 837799,这是正确的!

这真的让我很困惑,因为我根本看不出有什么区别。我明白如果我们使用int进行除法运算时,我们可能会在无意的情况下对数字进行四舍五入。但在这种情况下,我们总是检查是否n在除以 2 之前可以被 2 整除。所以我认为使用整数是完全安全的。我没看到什么?

这是完整的代码,如果您想亲自查看,请复制、粘贴并运行它。尽管进行了多次迭代,它还是在几秒钟内运行。 =)


你的问题是溢出。如果你改变int n to long n,你会得到正确的答案。

请记住:序列中的数字可以是真的很大。太大了,溢出来了int的范围。但不是(在这种情况下)double's, or long's.

在链条中的某一点,n is 827,370,449你按照3n + 1分支。这个值想要成为2,482,111,348,但它超出了容量int(这是2,147,483,647在积极的领域)并带你去-1,812,855,948。事情从那里开始向南发展。 :-)

所以你的理论是你可以使用整数(我应该说integral) 数字是正确的。但他们必须有完成任务的能力。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当不应该使用整数和双精度数时会给出不同的答案 的相关文章

随机推荐

  • winforms 事件中未保留同步上下文

    我有以下 winforms 事件 public MainForm InitializeComponent new Form ShowDialog This causes the problem private async void Main
  • 在swift ios中多线程并行执行多个任务

    我知道队列的创建并且能够执行单个任务 但如何并行执行多个任务 并发队列 gt let concurrentQueue DispatchQueue label com some concurrentQueue attributes concu
  • 配置 Microsoft Application Insights 以监视 Windows 服务

    是否可以配置微软的应用洞察 http msdn microsoft com en us library dn481095 aspx监控 Windows 服务 我有一个在 Azure 中运行的 VM 其中托管了 Web 服务 我需要安装哪个版
  • 在 fxml 文件之间切换

    我在 swing 组件内使用 jfxPanel 创建了一个应用程序 我面临的问题是我无法更改 fxml 文件 当单击 fxml 的按钮时 我想处理该 fxml 并在那里加载另一个 fxml 文件 这就是我到目前为止所做的 public cl
  • Objective-C 类前缀 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 您对命名 ObjC 类有何偏好 我有点不确定对此最合理的方法是什么 所以很高兴听到一些其他意见 Apple 建议为 cocoa 类添加前缀 因为
  • 在 jQuery 中,如何使用元素选中和取消选中所有复选框? [复制]

    这个问题在这里已经有答案了 我有以下代码 它使用通常位于复选框顶部的 LABEL 元素检查页面上的所有复选框 现在如何使用相同的 LABEL 元素取消选中所有框 jQuery document ready function var chec
  • Kibana4 监听端口 80 而不是端口 5601

    我在运行 RHEL7 的 Amazo EC2 实例上运行 elasticsearch 1 4 和 kibana4 Kibana4 作为独立进程运行 未部署在 nginx 等 Web 容器中 它正在侦听端口 5601 默认端口 我想让 kib
  • Android - 加载图像Url并在ImageView中显示

    我有这段代码来加载图像 服务器是安全的 我得到的答复是 200 这意味着可以 然后还要加载正确的网址 问题是当我运行我的应用程序时 图像不会被加载 try Bitmap bitmap null URL imageUrl new URL ur
  • C++ - 生成随机位集的有效方法,具有可配置的平均“1 与 0”比率

    我正在寻找一种高效的方法来生成随机数std bitset设定长度 我还希望能够影响1s 出现在结果中 因此如果概率值设置得足够低 则所有结果中只有一小部分会包含1 但仍然有可能 但不太可能 导致所有1s 它将用于计算量很大的应用程序 因此欢
  • 动态调用函数 - Python

    我有一个功能列表 例如 def filter bunnies pets def filter turtles pets def filter narwhals pets 有没有办法通过使用代表其名称的字符串来调用这些函数 e g filte
  • 如何更新 GridView / ListView 的每个元素上的 ProgressBar 状态?

    目前我有一个 GridView 每个元素都应该有一个单独的 ProgressBar 这些元素代表单独的下载 我想使用这些进度条显示下载的状态 但我应该如何更新它们呢 我的问题是 根据文档 以及我在 Google IO 视频中听到的内容 更新
  • 我应该实际使用哪个版本的 jQuery? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 所以几个月前 有一段时间我实际上并不需要 jQuery 来完成任何事情 并且几乎忘记了它 然后我醒了 所以 我前往http jquery
  • C++ 迭代模板 Map

    当我有一个包含模板映射和一个模板类const iterator声明如下代码typedef 如何迭代类外部映射的元素 例如 main 中以将它们打印在输出上 template
  • 删除小于X的数组元素

    我有数组 arr1 array 5 3 9 11 6 15 arr2 array 11 20 1 3 8 现在我需要循环遍历 arr1并找到小于的最大数X foreach arr1 as x need element that is MAX
  • 如何在 Laravel 中使用主密码登录用户?

    在 Laravel 中 我想使用主密码登录我的任何用户帐户 这是我在控制器中尝试过的 if Input get password master password email Input get email user User find em
  • 通过 YAML 发布管道运行 azure powershell 脚本

    我有正常且工作的发布管道 通过给定的某个部署组 该管道执行一些任务 复制脚本 执行该 powershell 脚本 在部署组中定义的目标计算机上 删除脚本 我知道 YAML 不支持部署组 但是 幸运的是我 到目前为止我的部署组只有一台机器 我
  • UI 测试 - isSelected 始终返回 false

    我们最近使用 Xcode 8 2 1 8C1002 将 Swift 2 3 项目更新为 Swift 3 现在大多数与 tableViews 和 isSelected 属性相关的 UI 测试都不起作用 即使选择了对象 它也始终返回 false
  • mysql 无法添加外键?

    我使用MySQL Workbench在表中添加外键 但发生了一些奇怪的错误 这是SQL语句 ALTER TABLE tansung Declaration ADD COLUMN goodsId INT 11 NOT NULL AFTER d
  • 如何获取 UIScrollView 中的当前缩放级别?

    为了尝试创建一种解决方法 使图像在 UIScrollView 中居中并使其表现得像 Apple 的照片应用程序一样 我需要获取当前的缩放级别并使用该数字来计算图像在每个缩放级别应插入的量 注意 我知道一些程序员通过将图像集中在与滚动视图大小
  • 当不应该使用整数和双精度数时会给出不同的答案

    我正在解决欧拉项目问题14 https projecteuler net problem 14使用java 我并不是寻求帮助解决问题 我已经解决了 但我遇到了一些我无法弄清楚的事情 问题是这样的 为正集合定义以下迭代序列 整数 n n 2