我试图在Swift中解决Project Euler的第25个问题(https://projecteuler.net/problem=25),并在while
循环中改变条件时收到一条非常隐秘的错误消息。
起初,我从2开始,然后是10开始,得到了正确的结果。但随后100,程序崩溃了。
var index = 3
var a = 1
var b = 2
while String(b).characters.count < 100 {
let temp = b
b = a + b
a = temp
index += 1
}
print(index)
这是错误:
0 swift 0x00000001103b24f7 PrintStackTraceSignalHandler(void*) + 39
1 swift 0x00000001103b19a6 SignalHandler(int) + 646
2 libsystem_platform.dylib 0x00007fffb3a89b3a _sigtramp + 26
3 libswiftCore.dylib 0x0000000112d6a40d (anonymous namespace)::Sentinels + 12861
4 swift 0x000000010dcfadcf llvm::MCJIT::runFunction(llvm::Function*, llvm::ArrayRef<llvm::GenericValue>) + 655
5 swift 0x000000010dd009c3 llvm::ExecutionEngine::runFunctionAsMain(llvm::Function*, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, char const* const*) + 707
6 swift 0x000000010d1fdc69 swift::RunImmediately(swift::CompilerInstance&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, swift::IRGenOptions&, swift::SILOptions const&) + 3385
7 swift 0x000000010d1d2622 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 50738
8 swift 0x000000010d17fd6c main + 9052
9 libdyld.dylib 0x00007fffb387a235 start + 1
Stack dump:
0. Program arguments: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -interpret ./project-euler/025/problem025.swift -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -color-diagnostics -module-name problem025
[1] 8705 illegal hardware instruction ./project-euler/025/problem025.swift
有谁知道为什么会这样?完全相同的代码在Python和Ruby中运行顺畅。
答案 0 :(得分:1)
您的算法是正确的,但问题是Swift 64位整数只能保存最大值9,223,372,036,854,775,807,即9.22e + 18。无符号整数可以是两倍大,但仍然不会接近1,000位。 Decimal
/ NSDecimalNumber
可以获得最多38位数字,但仍然不够。
您可能想要创建/使用可以表示任意大整数的库。只需在互联网上搜索&#34;迅速任意大整数&#34;或者&#34; swift biginteger&#34;。
然后你的例程将正确计算结果。
答案 1 :(得分:0)
如果您的所有操作都是正面的,那么您可以使用UInt64
。这可能会阻止溢出,因为你会获得更长的范围。