首页 > 解决方案 > 线程“主”在“尝试与溢出相乘”时惊慌失措

问题描述

我用 Rust 解决了 Project Euler #4。有一行代码花了我大约 30 分钟来解决。当我删除该行时,我得到: thread 'main' panicked at 'attempt to multiply with overflow' 解释在代码中:(见操场上

奇怪的是,rev 是 0,但是当我尝试时:rev=0; 在我标记为“这里的问题”的地方,即使值相同,它也会解决问题。这是为什么?我已经检查过了,这不是一个重复的问题。我也不知道在标题中写什么,因为这是一个不常见的错误。

//Task: Find the largest palindrome made from the product of two 3-digit numbers.
    fn main(){   
        let mut pal;//palindrome
        let mut ram;//a second number that's equal to palindrome, to copy it's digits.
        let mut rev=0;//reversed palindrome
        let mut lar=0;//largest palindrome
        for ln in 100..1000{//ln=left number     }  left number * right number = palindrome
            for rn in 100..1000{//rn=right number}                                   ^
                pal=ln*rn;//                                                         |
                ram=pal;
                
                //-----------------Problem here-----------------
                //rev=ram%10;//when this line is commented, it gives:
                //thread 'main' panicked at 'attempt to multiply with overflow', why_overflow_pe4.rs:13:17
                
    
                while ram>0{//getting the last digit of ram for the first digit of rev
                            //and continuing until ram=0 and rev is reversed.
                    rev*=10;
                    ram/=10;
                    rev+=ram%10;
                }
                rev/=10;
                if pal==rev && pal>lar{//if rev=pal and our palindrome is larger than previous largest
                                      //make the largest palindrome current palindrome
                    lar=pal;
                }
            }
        }
        println!("{}",lar);
    }

-谢谢!

标签: memoryrust

解决方案


在乘以之前检查内容rev可能会有所帮助:rev值为 1010102010,并将其乘以 10 会导致数字太大(即需要太多位)而无法由rev.

如果取消注释rev=ram%10,rev肯定会小于 10,因此将其乘以 10 最多得到 100。

u8您可以使用, u16, u32,等来判断数据类型大小u64,但甚至会溢出。因此,您可以调整您的算法或使用支持超过 128 位的数据类型。u128u128


推荐阅读