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
2
9
代码如下:
#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;
}