(3 ^ n + 2 ^ n)%10表示大n

时间:2017-02-18 21:11:34

标签: c++

所以我的数字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 个答案:

答案 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;
}