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
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;
}



代码学习笔记 文章被收录于专栏

学习笔记,pat,牛客

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务