2017-02-18 64 views
3

所以我有一個數字N有最多9位數字,我必須得到3^n + 2^n的最後一位數字。這種問題有沒有規則?我到目前爲止的代碼是:(3^n + 2^n)%10對於大的

#include <fstream> 
#include <algorithm> 
#include <math.h> 
using namespace std; 

ifstream fin("input.in"); 
ofstream fout("input.out"); 

int main(){ 
int n; 
fin>>n; 

fout<<fmod(pow(3,n)+pow(2,n),10); 
} 

但是,如果我使用這個和n大於1000,它會顯示nan。

我的問題是:這樣的問題是否有規則?

回答

9

好了,我們知道(3^n + 2^n) % 10 = ((3^n % 10) + (2^n % 10)) % 10,所以我們可以用Modular Exponentation迅速解決這個問題。

的基本前提是,3^n % 10 = (3 * (3^(n-1) % 10)) % 10

+0

即工作編輯偉大!萬分感謝! –

+0

@ChorMay很高興幫助! – Tyzoid

6

那麼,最簡​​單的答案是:3,9,7或1

3^0 === 1; 
3^1 === 3; 
3^2 === 9; 
3^3 === 7; 
3^4 === 1; 
3^5 === 3; 

因此,3^n的最後一位數字,基於N次所以, N%4 == 0 => 3^n的最後一位是1,== 1 => 3,== 2 => 9,== 3 => 7.

您可以寫出2^n相同:

1,2,4,8,6,2,...

該循環可以重複進行所有的時間,排除了主要規則:最後一個數字爲2^n是:

N == 0 => 1 
N > 0 => 
    (N - 1) % 4 == 0 => 2 
    (N - 1) % 4 == 1 => 4 
    (N - 1) % 4 == 2 => 8 
    (N - 1) % 4 == 3 => 6 

後你計算了3^n和2^n的最後一位數字,只需將它們加在一起即可。

+0

這是一種偉大的思維方式,感謝您的意見! –

2

你可以用數學方法解決它。讓我們看一下序列,然後再看3,9,7和1。它立即給出:

ù 4K = 1,U 4K + 1 = 3,U 4K + 2 = 9,U 4K + 3 = 7

現在看以v n = 2 n%10:v = 1然後再次2,4,8,6和2。它給出了對於k> 0:

v 4K = 6,V 4K + 1 = 2,V 4K + 2 = 4,V 4K + 3 = 8

您立即有結果:對於N> 1只看N」 = N%4,其結果分別爲7,5,3,5

在C++中,這將給:

#include <fstream> 
using namespace std; 

ifstream fin("input.in"); 
ofstream fout("input.out"); 

int main(){ 

    int n; 
    fin>>n; 

    int result[] = { 7,5,3,5}; 
    fout<<(n == 0) ? 2 : result[n%4]; 
    return 0; 
}