[英](3^n + 2^n) % 10 for large n
所以我有一個N最多9位數,我必須得到3 ^ n + 2 ^ n的最后一位數。 這種問題有規則嗎? 我到目前為止的代碼:
#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。
我的問題是:這樣的問題有規則嗎?
好吧,我們知道(3^n + 2^n) % 10
= ((3^n % 10) + (2^n % 10)) % 10
,所以我們可以使用Modular Exponentation來快速解決這個問題。
基本前提是3^n % 10 = (3 * (3^(n-1) % 10)) % 10
嗯,最簡單的答案如下:
3^0 === 1;
3^1 === 3;
3^2 === 9;
3^3 === 7;
3^4 === 1;
3^5 === 3;
因此,3 ^ n的最后一位數為3,9,7或1,基於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的最后一位數后,只需將它們加在一起即可。
你可以用數學方法解決它。 讓我們看一下序列u n = 3 ^ n%10:u 0 = 1,然后再看3,9,7和1。 它立即給出:
u 4k = 1,u 4k + 1 = 3,u 4k + 2 = 9,u 4k + 3 = 7
現在看v n = 2 n %10:v 0 = 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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.