user-0 提问: 求a^b的个位数

回复:
user: user-1
content: #include <iostream> #include <cmath> using namespace std; int main(){     long long x,y,a;     cin>>x>>y;a=x;     for (int i=2;i<=y;i++){         a*=x;     }     cout<<a%10;     return 0; }  也可以这样： #include <iostream> #include <cmath> using namespace std; int main(){     int x,y,z;     cin>>x>>y;     z=pow(x,y);     cout<<z%10;     return 0; }

user: user-2
content: 引用 10 楼 云起之端的回复:#include<stdio.h> int main() { 	int a,b,i,c; 	scanf("%d %d",&a,&b); 	for(i=2;i<=b;i++) 	{ 		a=a*a; 	} 	c=a%10; 	printf("%d",c); } 这个哪里不对呀。快速蜜  #include <stdio.h> #include <stdlib.h>  int main() {          int a,b,c,res,base;     scanf("%d%d",&a,&b);     c=a^b;     if(c&1){         res=1;   base=1;         while(c){             c>>=1;             base=base*2;             if(c&1)   res=res+base;         }     }     else {         res=0;  base=1;         while(c){             c>>=1;             base=base*2;             if(c&1)   res=res+base;         }     }     res=res%10;     printf("%d",res);     return 0; }

user: user-2
content: 引用 10 楼 云起之端的回复:#include<stdio.h> int main() { 	int a,b,i,c; 	scanf("%d %d",&a,&b); 	for(i=2;i<=b;i++) 	{ 		a=a*a; 	} 	c=a%10; 	printf("%d",c); } #include <stdio.h> #include <stdlib.h>  int main() {          int a,b,c,res,base;     scanf("%d%d",&a,&b);     c=a^b;     if(c&1){         res=1;   base=1;         while(c){             c>>=1;             base=base*2;             if(c&1)   res=res+base;         }     }     else {         res=0;  base=1;         while(c){             c>>=1;             base=base*2;             if(c&1)   res=res+base;         }     }     res=res%10;     printf("%d",res);     return 0; }

user: user-3
content: 没有测试的代码。 一个数相乘后个位数会有回归的现象，这里就是记录下来这些数在第几次产生个位回归现象。 #include <studio.h> int rem_val[10] = {1,1,4,4,2,1,1,4,4,2}; int val[10][4] = {{0,0,0,0},{1,1,1,1},{2,4,8,6},{3,9,7,1},{4,6,4,6},{5,5,5,5},{6,6,6,6},{7,9,3,1},{8,4,2,6},{9,1,9,1}}; int main(){ int base,pow; scanf(“%d%d”,&base,&pow); if(0==pow) printf(“1\n”); else if (0==base) printf(“0\n”); else printf(“%d\n”,val[base%10][pow%rem_val[base%10]]); return 0; }

user: user-4
content: 引用 楼主 唐海华的回复:请仔细阅读右侧代码，根据方法内的提示，在Begin - End区域内进行代码补充，具体任务如下： 给定两个数a，b(0 < a&&b <=2^30)，求a^b的最后一位数。（即a的b次幂的个位数） 提示：这题有一定的难度，小心超时，或超出数字的存储极限。 效果如下： 输入：6667 4454。 输出：9。 测试说明 平台会对您的代码进行运行测试，如果实际输出与预期输出相同，则算通关。  我做了很久，但是好像错了 快速幂对10取模就可以了，时间复杂度O(log n)

user: user-5
content: 给个思路，只取个位数进行计算，每次取得的数都去个位数做a^b的计算，本质是使用循环来做，没去循环的结果取余数

user: user-6
content: a,b=map(int,input().split()) c=a**b print(str(c)[-1])

user: user-7
content: 只做最后一位的乘法就行了

user: user-8
content: 一边乘一边对十取模进行b次操作就可以了

user: user-9
content: 上面是通过计算得出的表，实际上这个表示死的。基本上那个表只有[1,2,4]这些值，因此你可以直接去最小公倍数4,然后对b取余，后面的只要最多四次幂，就可以得到结果了

user: user-9
content: 稍微写了一下，没仔细测。。#include <iostream> using namespace std; int main() { 	int a = 0; 	int b = 0;  	//计算出个位数的循环情况 	int loopTable[10] = { 0 }; 	for (int i = 0; i < 10; i++) { 		int temp = i; 		while (temp != i || loopTable[i] == 0) { 			temp = (temp*i) % 10; 			loopTable[i]++; 		} 	} 	while (true) { 		std::cin >> a; 		std::cout << "获取a成功，值为：" << a << std::endl; 		std::cin >> b; 		std::cout << "获取b成功，值为：" << b << std::endl;  		//获取a的个位数 		int a_base = a % 10; 		if (b == 0 && a > 0) { 			std::cout << "计算结果为：" << 1 << std::endl; 		}  		//获取 		int b_base = b%loopTable[a_base]; 		if (b_base == 0) { 			b_base = loopTable[a_base]; 		} 		int nResult = (int)std::pow(a_base, b_base) % 10; 		std::cout << "计算结果为：" << nResult << std::endl; 		std::cout << "********************************"<< std::endl; 	} 	return 0; }

user: user-10
content: 这个题目出得好。基本思想就是先用数学方法解出最佳公式，而不是拼命循环！

user: user-11
content: 顺序求a的个数位的1次最多一直到9次的个数位就可以了，看看几次能循环 实际最多4次就够了 0,5都是固定1次 偶数的话：2468，奇数1379

user: user-12
content: 对a^b取模10即所求结果。 1.若b很小，循环遍历b次，中间结果不断%10防止溢出。参考：同余定理。 2.若b很大，循环太慢了，参考：快速幂取模。

user: user-13
content: 引用 11 楼 qq_45822392的回复:我这样为啥不可以 你只求了一次，比如c=625;你求一次后就是c=25; 你应要一个循环  #include <iostream> using namespace std; #include <math.h> int main(){      int a=3,b=4,x=0;      x=pow(a,b);          while(x>10)           x=x%10;     cout << "x的最后一位为:"<< x <<endl;     return 0; }

user: user-13
content: #include <iostream> using namespace std; #include <math.h> int main(){      int a=3,b=4,x=0;      x=pow(a,b);          while(x>10)           x=x%10;     cout << "x的最后一位为:"<< x <<endl;     return 0; }

user: user-0
content: 厉害👍！！！！！！！

user: user-14
content: 我用#CSDN#这个app发现了有技术含量的博客，小伙伴们求同去《N^N最左边和最右边的数（数学）》, 一起来围观吧 https://blog.csdn.net/tb_youth/article/details/95582618?utm_source=app

user: user-15
content: 指数运算至少针对个位数一定有周期

user: user-16
content: 啊，好像不算太复杂：结果只与连乘计算的个位数相关，把a的个位存入过程量c，m=(m*c)%10;  另外，如果把c=0,1;的情况单独讨论，可以加速部分计算结果。