高精度公约数 SuperGCD【C++/Java】

这篇博客介绍了如何解决高精度数字的最大公约数问题。作者通过一个与Sheng Bill比赛的故事引入,提出了使用C++和Java两种语言的解决方案。在C++中,通过四位一存的数据表示和二进制方法提高效率。而在Java中,借助BigInteger类可以轻松实现,使得这类问题变得简单。文章讨论了两种语言在处理此类问题上的效率差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值