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

运行结果

1531909-9d4ad70adc387245.png
运行及结果

参考

ACM — Rightmost Digit
A hard puzzle

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要表示一个除以10的余为7,可以使用取模运算符(%),即将该对10取模,如果余为7,则表示该除以10的余为7。例如,对于n,表示其除以10的余为7的代码可以写成:n % 10 == 7。 ### 回答2: 要表示一个除以10后的余为7,可以用学表达式n % 10 = 7来表示。其中,n是一个,%表示取余操作。 举个例子来说明,假设n = 27,将它除以10后的余为7: 27 % 10 = 7 这意味着当27除以10时,其余为7。换句话说,将27分成10个等量的部分,其中的余部分是7。另外,如果n是一个以7结尾的,如17、37、47等等,它们除以10后的余也都是7。 这个学表达式适用于任何整n,只要它除以10后的余是7,都可以用 n % 10 = 7来表示。这个表达式可以用于数论、编程等领域,以值间的关系和运算结果。 ### 回答3: 一个除以10后的余为7,表示这个模10的余为7。例如,如果一个是17,除以10的余即为17模10的余,结果是7。同样,27、37等等这些与7同余的都满足题目的条件。 可以用学符号来表示这一条件,假设这个为x,则x÷10的余为7可以表示为x ≡ 7 (mod 10)。这里的符号≡表示“同余”,即两个除以一个得到的余相同。 为了找到满足条件的,可以对7取模10的余得到7、17、27、37等等一系列。这些都是原始x加上10的倍,即x = 7 + 10k,其中k是任意整。 所以答案不只是一个具体的,而是由多个构成的集合。这个集合中的都满足除以10后的余为7。 综上所述,一个除以10后余为7,可以用x ≡ 7 (mod 10)表示,并且这个集合中的为 x = 7 + 10k,其中k为任意整

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值