题意:这个题目题中的图片已经给的够清楚了,就算不怎么读题,也能yy大概的意思,况且题目也很短,很容易都出来就是给定 a,b,然后求a^b的个位数!
思路:开始想到了同余模,可是没有往深处想,发现只用同余模和快速幂是无法解决的,一是因为数太大,二是算出来的数也无法保存,胡思乱想想到用double,什么long double都搞出来了,不过越搞越复杂,反而陷入思维深渊!后来想到底数要保留到最后一位,但是不知道怎么使指数降下来,后来看了题解,才明白个位数的指数次都是以1,2,4,作为循环,这就好办了,直接%4,就能对指数精简化了!后面至于用快速幂,打表,或者pow已经不是重点了,因为都能算出来了!
code:
思路:开始想到了同余模,可是没有往深处想,发现只用同余模和快速幂是无法解决的,一是因为数太大,二是算出来的数也无法保存,胡思乱想想到用double,什么long double都搞出来了,不过越搞越复杂,反而陷入思维深渊!后来想到底数要保留到最后一位,但是不知道怎么使指数降下来,后来看了题解,才明白个位数的指数次都是以1,2,4,作为循环,这就好办了,直接%4,就能对指数精简化了!后面至于用快速幂,打表,或者pow已经不是重点了,因为都能算出来了!
code:
#include <iostream> #include <cstdio> #include <cmath> #include <string> #include <cstring> #include <algorithm> using namespace std;int cal(string n) //化指数为2位数 {if (n.size()==1) return n[0]-'0';int t=n[n.size()-1]-'0';t=t+(n[n.size()-2]-'0')*10;t%=4;if (t==0) t=4;return t; } int sol(int a,int b) //一位数的2位数次幂,也可pow,快速幂,打表 {int t=1;for (int i=0;i<b;i++)t*=a,t%=10;t%=10;return t; } int main() {string m,n;while (cin>>m>>n){if (m=="0"&&n=="0") break;int a=m[m.size()-1]-'0'; //只取末尾一位int b=cal(n);printf("%d\n",sol(a,b));} }