memory - 线程“主”在“尝试与溢出相乘”时惊慌失措
问题描述
我用 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);
}
-谢谢!
解决方案
在乘以之前检查内容rev
可能会有所帮助:rev
值为 1010102010,并将其乘以 10 会导致数字太大(即需要太多位)而无法由rev
.
如果取消注释rev=ram%10
,rev
肯定会小于 10,因此将其乘以 10 最多得到 100。
u8
您可以使用, u16
, u32
,等来判断数据类型大小u64
,但甚至会溢出。因此,您可以调整您的算法或使用支持超过 128 位的数据类型。u128
u128
推荐阅读
- node.js - JS postgres - 错误的用户名连接
- c - 如何使用 OpenMP 并行遍历树
- wpf - 如何将我的组合框设置为 Office 2016 Telerik 版本?
- python - 从字典列表中删除重复项
- python - 如何计算非常小的数值的方差?
- groovy - Jmeter HTTP setPath - 我如何在 http 采样器中设置动态路径
- tensorflow - 如何在 TensorFlow 中进行预测?
- r - 重塑后 DataFrame 中的意外值
- rest - 带有身份验证的 RESTful API URL 设计
- python - 如果条件匹配两个“for 循环”中的两个字符串