Description
Sheng Bill 有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的 GCD(最大公约数)!因此他经常和别人比赛计算 GCD。有一天 Sheng Bill 很嚣张地找到了你,并要求和你比赛,但是输给 Sheng Bill 岂不是很丢脸!所以你决定写一个程序来教训他。
Input输入共两行,第一行一个数 A,第二行一个数 B。0<A,B≤1010000。
Output一行,表示 A和 B 的最大公约数。
Sample Input
12
54
Sample Output
6
题目描述很简单,就是输入两个高精度数,求他们的最大公约数
由于数据量巨大,故若用c++高精度写需要用到很多巧妙的算法:
1.数据四位一存,这样方便并且计算迅速,且消耗数组容量小。
2.利用二进制求最大公约数,即将其转化为2^k*a后来计算(Q:为什么多此一举?当然是为了效率!举个例子:若为一个很大的数和1的计算;若直接高精度减法则会重复调用不知道多少次,故会很慢)
剩下的也就是堆一堆高精度代码了,C++AC代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 10000
#define M 10000
int a[M]={
0},b[M]={
0},c[M]={
0},f[M]={
0},s[100]={
0},s0=0,T;
void init(int* a)
{
string s;
cin>>s;
int len=s.length(),i,j;
for(i=0;i<len;i++)
{
j=(len-i+3)/4;//4位4位地存放,前面大,后面小,得从后往前推
a[j]=a[j]*10+s[i]-'0';//每逢4位下标才进一位注意这里是倒着存放,因为i从1开始,而j从末尾开始
}
a[0]=(len+3)/4;//长度
}
void print(int* a)
{
int i,j;
cout<<a[a[0]];
for(i=a[0]-1;i>0;i--)
for(j=N/10;j>0;j/=10)
cout<<a