求一个数n次方后的末尾数(数论/快速幂)

简介: hdu1061-Rightmost Digithdu1097-A hard puzzle这两个oj题目思路几乎一样,都是为了快速求出一个数n次方后的末尾数为都多少?

问题描述


hdu1061-Rightmost Digit

hdu1097-A hard puzzle

这两个oj题目思路几乎一样,都是为了快速求出一个数n次方后的末尾数为都多少?


解题思路


1的所有次方都是1

0的所有次方都是0

5的所有次方都是5

6的所有次方都是6

2^1=2 2^2=4 2^3=8 2^4=6(四个一循环)

3^1=3 3^2=9 3^3=7 3^4=1(四个一循环)

7^1=7 7^2=9 7^3=3 7^4=1(四个一循环)

4^1=4 4^2=6(两个一循环)

8^1=8 8^2=4(两个一循环)

9^1=9 9^2=1(两个一循环)


代码实现


下面以hdu1097-A hard puzzle为例

  • 代码1(自己写的傻乎乎)

#include<iostream>
using namespace std;
int main(){
    int m,n,last;
    while(cin>>m>>n){
        last=m%10;
        if(last==0||last==1||last==5||last==6){
            cout<<last<<endl;
        }else if(last==4){
            if(n%2==1){
                cout<<4<<endl;
            }
            if(n%2==0){
                cout<<6<<endl;
            }
        }else if(last==9){
            if(n%2==1){
                cout<<9<<endl;
            }
            if(n%2==0){
                cout<<1<<endl;
            }
        }else if(last==2){
            if(n%4==1){
                cout<<2<<endl;
            }
            if(n%4==2){
                cout<<4<<endl;
            }
            if(n%4==3){
                cout<<8<<endl;
            }
            if(n%4==0){
                cout<<6<<endl;
            }
        }else if(last==3){
            if(n%4==1){
                cout<<3<<endl;
            }
            if(n%4==2){
                cout<<9<<endl;
            }
            if(n%4==3){
                cout<<7<<endl;
            }
            if(n%4==0){
                cout<<1<<endl;
            }
        }else if(last==7){
            if(n%4==1){
                cout<<7<<endl;
            }
            if(n%4==2){
                cout<<9<<endl;
            }
            if(n%4==3){
                cout<<3<<endl;
            }
            if(n%4==0){
                cout<<1<<endl;
            }
        }else if(last==8){
            if(n%4==1){
                cout<<8<<endl;
            }
            if(n%4==2){
                cout<<4<<endl;
            }
            if(n%4==3){
                cout<<2<<endl;
            }
            if(n%4==0){
                cout<<6<<endl;
            }
        }
    }
    return 0;
}


  • 代码2

#include <stdio.h>
#include <math.h>
int main() {
    int a[10] = {1, 1, 4, 4, 2, 1, 1, 4, 4, 2};
    int n, num, rmd, ans; // rmd = rightmost digit
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        scanf("%d", &num);
        rmd = num % 10;
        ans = (int) pow(rmd, num % a[rmd] ? num % a[rmd] : a[rmd]);
        printf("%d\n", ans % 10);
    }
}


  • 代码3

#include<iostream>//1097
#include<algorithm>
using namespace std;
int main()
{    int a,b,c[4];
  while(cin>>a>>b)
  {
      a=a%10;
      c[0]=a;//一次方的末尾数
     c[1]=(c[0]*a)%10;//二次方的末尾数
     c[2]=(c[1]*a)%10;//三次方的末尾数
     c[3]=(c[2]*a)%10;//四次方的末尾数
     if(b%4==1)
         cout<<c[0]<<endl;
     if(b%4==2)
         cout<<c[1]<<endl;
     if(b%4==3)
         cout<<c[2]<<endl;
     if(b%4==0)
         cout<<c[3]<<endl;
  }
  return 0;
}


运行结果


1.png

运行及结果


参考


ACM — Rightmost Digit

A hard puzzle


相关文章
|
8月前
|
BI 测试技术 Windows
【数位】【数论】【分类讨论】2999. 统计强大整数的数目
【数位】【数论】【分类讨论】2999. 统计强大整数的数目
|
8月前
62.编程求所有的三位素数,且要求该数是对称数
62.编程求所有的三位素数,且要求该数是对称数
52 0
|
8月前
|
算法 测试技术 C#
【数学】【数论】【最大公约数】1819. 序列中不同最大公约数的数目
【数学】【数论】【最大公约数】1819. 序列中不同最大公约数的数目
|
8月前
[leetcode 数位运算] 2939. 最大异或乘积 M
[leetcode 数位运算] 2939. 最大异或乘积 M
|
存储
A除于B(大数相除)
A除于B(大数相除)
89 0
|
算法 C++
剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)
剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)
【每周一坑】​正整数分解质因数 +【解答】计算100以内质数之和
关于分解质因数:每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数。分解质因数只针对合数。
|
算法 C语言 C++
【数论】最大公约数、约数的个数与约数之和定理
先来科普下什么是约数:当a能被b整除,我们就说b为a的约数,b的倍数为a
142 0
leetcode-829. 连续整数求和(数论)
这题求连续正整数,刚好满足等差数列,可以用等差数列求和公式 n = (i + (i + k)) * (k + 1) / 2 其中i是连续正整数的首项,k是尾项和首项的差值
129 0
leetcode-829. 连续整数求和(数论)

热门文章

最新文章