zjutcpp1244个位小数
Description:
Ray 参加了数学兴趣小组,其中一道题目是求a^b(a的b次方)个位数字是多少,聪明的Ray 一下子就解决了,你是否也像Ray 一样聪明呢?Input:
第一行是一个整数N,表示有N组数据1<=N<=10000。 每组数据是两个整数a和b,a、b的位数都不超过100位且a、b>0。Output:
输出a^b的个位数字,每组占一行。Sample Input:
3 3 2 12 9 123456789 121
Sample Output:
9 29代码如下:#include<iostream> #include<string> using namespace std; int buf[][4]//个位数从0~9的各个次方的个位数的规律,例如3的1次方个位3 //3的2次方个位9,3的3次方个位7,3的4次方个位1,将个位1放在啊buf[3][0]的位置是 //因为次方要对4取余,规律是4次一循环,4%4=0,所以4次方的倍数的都放在0列 { 0,0,0,0, 1,1,1,1, 6,2,4,8, 1,3,9,7, 6,4,6,4, 5,5,5,5, 6,6,6,6, 1,7,9,3, 1,8,4,2, 1,9,1,9, }; int c[100];//本题有要求说a,b不超过100位,所以要用string类保存,然后逐位保存到数组中 int size1; int main() { int n; while (cin >> n) { while(n--) { string a, b; cin >> a >> b; if (a[0] == 0 && b[0] == 0) break; int len1 = a.length(); int s = a[len1-1] - '0';//直接先拿出a的个位进行计算,其他位不需要 int len2 = b.length(); int an = 0,t=1; size1 = 0; for (int i = 0; i < len2; i++)//将b的每一位逐位保存到数组c中 { an = b[i] - '0'; c[size1++] = an; } int z; for(int i=0;i<size1;i++) { z= c[i] % 4;//从第一位开始,逐位地对4取余,如果z!=0,则z*10然后加到下一位去,模拟整数除法 if ( z!= 0) { if(i+1<size1)//防止数组越界 c[i + 1] += z * 10; } }//循环结束最后得到b对4的取余 cout << buf[s][z] << endl; } } return 0; }此题中有要求a,b的位数,如果都不是大整数,如0<a,b<10000;则可以用二分快速幂的方法代码如下:#include<iostream> using namespace std; int main() { int a, b; while (cin >> a >> b) { int ans = 1; while (b) { if (b % 2 != 0) { ans *= a; ans %= 10;//只把个位保存下来 } a *= a; b /= 2; } cout << ans << endl; } return 0; }
代码学习笔记 文章被收录于专栏
学习笔记,pat,牛客