加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

hdu 5050 大数

发布时间:2020-12-14 02:59:35 所属栏目:大数据 来源:网络整理
导读:http://acm.hdu.edu.cn/showproblem.php?pid=5050 大数模板最大公约数 信kuangbin,能AC #include cstdio#include cstdlib#include cmath#include cstring#include string#include queue#include vector#include iostream#include algorithmusing namespace

http://acm.hdu.edu.cn/showproblem.php?pid=5050

大数模板最大公约数

信kuangbin,能AC

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define clr0(x) memset(x,sizeof(x))

const int maxn = 1010;

struct Num
{
    int num[1100];
};

void print(const Num &hold)
{
    int k;

    for (k = maxn; k >= 0; k --)
    if (hold.num[k])
    break;

    for (int i = k; i >= 0; i --)
    printf("%d",hold.num[i]);
}

Num operator+(const Num &a,const Num &b)
{
    Num ret;
    int temp;

    clr0(ret.num);

    for (int i = 0; i <= maxn; i ++)
    {
        temp = ret.num[i];

        ret.num[i] = (temp + a.num[i] + b.num[i]) % 2;
        ret.num[i + 1] = (temp + a.num[i] + b.num[i]) / 2;
    }

    return ret;
}

bool operator==(const Num &a,int num)
{
    for (int i = 0; i <= maxn; i ++)
    if (a.num[i] != num)
    return false;

    return true;
}

bool operator<(const Num &a,const Num &b)
{
    for (int i = maxn; i >= 0; i --)
    {
        if (a.num[i] < b.num[i])
        return true;
        else if (a.num[i] > b.num[i])
        return false;
    }

    return true;
}

Num Complement(Num hold)
{
    char str[1100];
    Num ret,temp;

    strcpy(str,"1");

    clr0(temp.num);
    int bit = 0,lls = strlen(str);
    for (int i = lls - 1; i >= 0; i --)
        temp.num[bit ++] = str[i] - '0';

    ret = hold;


    for (int i = 0; i <= maxn; i ++)
    {
        if (ret.num[i])
        ret.num[i] = 0;
        else
        ret.num[i] = 1;
    }

    ret = ret + temp;

    return ret;
}

Num operator-(const Num &a,const Num &b)
{
    Num c,ret;

    c = Complement(b);

    ret = a + c;

    return ret;
}


Num operator/(const Num &hold,int num)
{
    Num ret;

    clr0(ret.num);

    for (int i = 0; i < maxn; i ++)
    ret.num[i] = hold.num[i + 1];

    return ret;
}

int operator%(const Num &hold,int num)
{
    return hold.num[0];
}

Num gcd(Num a,Num b,int &counter)
{
    while (true)
    {
        if (a < b)
        swap(a,b);

        if (b == 0)
        break;

        if (a % 2 == 0 && b % 2 == 0)
        {
            counter ++;

            a = a / 2;
            b = b / 2;
        }
        else if (a % 2 == 0 && b % 2 != 0)
        {
            a = a / 2;
            b = b;
        }
        else if (a % 2 != 0 && b % 2 == 0)
        {
            a = a;
            b = b / 2;
        }
        else
        {
            a = a - b;
            b = b;
        }
    }

    return a;
}

int main()
{
    int _;RD(_);
    char ta[1100],tb[1100];
    int counter;
    Num a,b,ans ;
    int bit,cas = 1;
    while (_--)
    {
        printf("Case #%d: ",cas++);
        scanf("%s%s",ta,tb);

        int lla = strlen(ta),llb = strlen(tb);

        clr0(a.num);
        bit = 0;
        for (int i = lla - 1; i >= 0; i --)
            a.num[bit ++] = ta[i] - '0';
        clr0(b.num);
        bit = 0;
        for (int i = llb - 1; i >= 0; i --)
            b.num[bit ++] = tb[i] - '0';

        counter = 0;
        ans = gcd(a,counter);

        print(ans);

        while(counter--)
            printf("0");

        puts("");
    }

    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读