所以我的数字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。
我的问题是:这样的问题有规则吗?
答案 0 :(得分:9)
好吧,我们知道(3^n + 2^n) % 10
= ((3^n % 10) + (2^n % 10)) % 10
,因此我们可以使用Modular Exponentation来快速解决此问题。
基本前提是3^n % 10 = (3 * (3^(n-1) % 10)) % 10
答案 1 :(得分:6)
嗯,最简单的答案如下:
b
因此,3 ^ n的最后一位数为3,9,7或1,基于N.所以, N%4 == 0 =&gt; 3 ^ n的最后一位是1,== 1 =&gt; 3,== 2 =&gt; 9,== 3 =&gt; 7。
你可以为2 ^ n写出相同的内容:
1, 2,4,8,6 ,2,......
这个循环可以一直重复,排除主要规则:2 ^ n的最后一位是:
3^0 === 1;
3^1 === 3;
3^2 === 9;
3^3 === 7;
3^4 === 1;
3^5 === 3;
计算完3 ^ n和2 ^ n的最后一位数后,只需将它们加在一起即可。
答案 2 :(得分:2)
你可以用数学方法解决它。让我们看一下序列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&gt; 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;
}