求一个数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


相关文章
|
6月前
|
人工智能 算法 BI
数学知识:质数与约数
数学知识:质数与约数
70 0
|
6月前
|
算法
容斥原理:能被整除的数
容斥原理:能被整除的数
|
机器学习/深度学习 算法
【Leetcode】面试题 16.05. 阶乘尾数、HJ7 取近似值
目录 面试题 16.05. 阶乘尾数 HJ7 取近似值
69 0
|
6月前
|
算法 测试技术 C#
【数学】【数论】【最大公约数】1819. 序列中不同最大公约数的数目
【数学】【数论】【最大公约数】1819. 序列中不同最大公约数的数目
|
6月前
[leetcode 数位运算] 2939. 最大异或乘积 M
[leetcode 数位运算] 2939. 最大异或乘积 M
|
算法 C++
剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)
剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)
|
算法 C语言 C++
【数论】最大公约数、约数的个数与约数之和定理
先来科普下什么是约数:当a能被b整除,我们就说b为a的约数,b的倍数为a
118 0
|
算法 C语言 C++
【数论】试除法判断质数,分解质因数,筛质数
将定义进行模拟,若整除了除1与其自身的另外的数,则为质数
126 0
|
算法 C++
【基础算法】几种特殊数(素数、公约数、完全数、亲密数) & C++实现
素数又称为质数,它指在一个大于1的自然数中,除了1和它自身外,没法被其他自然数整除的数。比1大,但不是素数的数称为合数。0和1既不是素数,也不是合数。因为素数的分布没有明显的规律,所以在程序中一般根据素数的定义来判断该数是否为素数。例如哥德巴赫猜想:哥德巴赫通过大量的数据猜测,所有不小于6的偶数,都可以表示为两个奇素数之和。后人将其称之为“1+1”。并且,对于每个不小于9的奇数,都可以表示为三个奇素数之和。
328 0
【基础算法】几种特殊数(素数、公约数、完全数、亲密数) & C++实现