2017-07-26 47 views
-1

這裏是我的代碼:大數(Ruby)的最後一位數字如何處理NaN?

def last_digit(n1, n2) 
array = (n1.to_i ** n2.to_i).to_s.split("") 
array[-1].to_i 
end 

試驗:(2^200)^(2^300)的最後一個十進制數,其中有超過10^92個十進制數字,是6

我試圖返回最後一個數字的最後一位數字,我敢肯定這是正確的,但是當我運行測試2返回失敗。

我認爲這是由於數字太大,我怎麼讓這個代碼保持準確,無論它有多大。

而且我該如何處理NaN,我搜索並努力尋找有用的東西。

感謝您的幫助。

回答

1

有一個有效的算法,它假定只有被激活的數字的最後一位數字很重要。請嘗試一下在您的測試,並隨時糾正在此實施方案的任何缺陷,你會通過運行他們

def digit_of_power(digit, n) 
    digit = digit % 10 

    case digit 
    when 0, 1, 5, 6 then digit 
    else 
    digit_of_square = digit * digit 

    if n.even? 
     digit_of_power(digit_of_square, n/2) 
    else 
     digit * digit_of_power(digit_of_square, (n - 1)/2) % 10 
    end 
    end 
end 
+0

非常感謝你 – FreddieCodes

0

代碼

ENDINGS = [[0,0,0,0], [1,1,1,1], [2,4,8,6], [3,9,7,1], [4,6,4,6],  
      [5,5,5,5], [6,6,6,6], [7,9,3,1], [8,4,2,6], [9,1,9,1]] 

def last_digit_of_power(digit, power) 
    return 1 if power.zero? 
    ENDINGS[digit][(power-1) % 4] 
end 

例子

找到讓我們試試power等於5,然後6

(5..6).each do |power| 
    puts "\npow = #{power}" 
    (0..9).each {|digit| puts "#{digit}: #{last_digit_of_power(digit, power)}"} 
end 

pow = 5 
0: 0 
1: 1 
2: 2 
3: 3 
4: 4 
5: 5 
6: 6 
7: 7 
8: 8 
9: 9 

pow = 6 
0: 0 
1: 1 
2: 4 
3: 9 
4: 6 
5: 5 
6: 6 
7: 9 
8: 4 
9: 1 

說明

這使用如受僱於@Igor相同的算法,但我不同的方式實現它。衆所周知(並且可以很容易地證明)每個數字0-9的最後一位數字取決於增加的功率週期數最多爲4位數。例如,考慮數字3。由於

[1,2,3,4,5].map { |power| 3**power } 
    #=> [3, 9, 27, 81, 243] 

3最後一位數字帶到每個這樣的5權力是[3, 9, 7, 1, 3]。由於3**5的最後一位數字與3**1的最後一位數字相同,因此我們推斷比最後一位數字3**6將與3**(6-4)3**2)的最後一位數字相同,即9等等。

現在假設我們想計算最後一位數字3**15。我們看到它將與3**(15-4)3**11)的最後一位相同,後者又將等於3**7的最後一位數字,然後是最後一位數字3**3,但我們已經知道最後一位數字,即7。它遵循的3**power最後一個數字是

[3, 9, 7, 1][(power-1) % 4] 

ENDINGS提供爲每個數字0-9權力1-4最後一位數字。注意週期長度是10156,是249和是42378。然而,對所有10數字使用4的週期長度是最方便的。

ENDINGS[digit]等於digit四個結局採取的1234的權力。考慮到電源的數字digit的最後一位power因此等於

ENDINGS[digit][(power-1) % 4] 
0

這是我的解決方案

def last_digit(n1, n2) 
    return 1 if n2 == 0 
    return 0 if n1 == 0 
    exp = (n2 % 4 == 0) ? 4 : n2 % 4 
    return (n1**exp) % 10 
end 

你可能想看看這篇文章(finding the last digit of a power)爲解決方案的更詳細的解釋到這個數學問題。

看看下錶爲:

enter image description here

你可以看到,對於週期重複的最大長度爲4

例如:

  • 2 * 2 = 4
  • 4 * 2 = 8
  • 8 * 2 = 16
  • 16 * 2 = 32
  • 32 * 2 = 64
  • 64 * 2 = 128
  • 128 * 2 = 256
  • 256 * 2 = 512

32中的最後一個數字是2(因爲它在512中),這意味着將數字乘以4後,它將重複其自身。

的算法遵循這樣的邏輯:

您降低指數,因爲他們知道,如果它是被4整除,它的新的值是4,因爲4倍乘以根據上面的表格給你的最後一位。否則,其值爲n2%4

作爲最後一步,你這樣做n1^exp%10因爲你只需要最後一個號碼。

注:

我有大量測試它成功。

  • N1 = 38710248912497124917933333333284108412048102948908149081409204712406
  • N2 = 226628148126342643123641923461846128214626

順便說一句,我知道我遲到的迴應你的問題。我只是覺得這有可能對某個人有所幫助。

相關問題