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,0,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, b, counter); print(ans); while(counter--)
printf("0"); puts("");
} return 0;
}

hdu 5050 大数的更多相关文章

  1. HDU 5050

    http://acm.hdu.edu.cn/showproblem.php?pid=5050 大数gcd import java.io.* ; import java.math.* ; import ...

  2. HDU - 5050 (大数二进制gcd)

    It's time to fight the local despots and redistribute the land. There is a rectangular piece of land ...

  3. hdu 5050 java程序求大数最大公约数

    import java.io.*; import java.math.*; import java.util.*; import java.text.*; public class Main { pu ...

  4. hdu 1002大数(Java)

    A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. hdu 5047 大数找规律

    http://acm.hdu.edu.cn/showproblem.php?pid=5047 找规律 信kuangbin,能AC #include <stdio.h> #include & ...

  6. hdu 4759 大数+找规律 ***

    题目意思很简单. 就是洗牌,抽出奇数和偶数,要么奇数放前面,要么偶数放前面. 总共2^N张牌. 需要问的是,给了A X B Y  问经过若干洗牌后,第A个位置是X,第B个位置是Y 是不是可能的. Ja ...

  7. HDU 1018 大数(求N!的位数/相加)

    Big Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  8. HDU 4927 大数运算

    模板很重要 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostrea ...

  9. HDU 5050 Divided Land(进制转换)

    题意  给你两个二进制数m,n   求他们的最大公约数  用二进制表示  0<m,n<2^1000 先把二进制转换为十进制  求出最大公约数  再把结果转换为二进制  数比較大要用到大数 ...

随机推荐

  1. C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)

      BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 : ...

  2. fedora25的免密码rsync服务配置

      目标:实现免密同步数据: 1.安装rsync包: 2.手工添加配置文件: cat  /etc/rsyncd.conf # See rsyncd.conf man page for more opt ...

  3. CF402D Upgrading Array

    原题链接 先用素数筛筛下素数,然后考虑贪心去操作. 先求前缀\(GCD\)(求到\(GCD\)为\(1\)就不用再往下求了),得到数组\(G[i]\),然后从后往前扫,如果\(f(G[i]) < ...

  4. django数据库多对多修改对应关系

    obj = models.Book.objects.get(id=1) #添加对应关系,给书添加作者# obj.m.add(3)# obj.m.add(2,4)# obj.m.add(*[1,2,3, ...

  5. Android Studio Tip of the Day

    1. Alt + Q 可以查看一个方法的简单参数列表. 2. 查看一个类,如果是eclipse的话,一般直接是F3, 现在的F3好痛苦.只能改为Ctrl + H,将就着用. 3. Ctrl + J 语 ...

  6. centos配置虚拟用户再也不用那么麻烦了

    http://wiki.centos.org/HowTos/Chroot_Vsftpd_with_non-system_users yum install -y vsftpd db4-utils vs ...

  7. python数据结构详解

    Python中常见的数据结构可以统称为容器(container).序列(如列表和元组).映射(如字典)以及集合(set)是三类主要的容器. 一.序列(列表.元组和字符串) 序列中的每个元素都有自己的编 ...

  8. python程序保存成二进制(不公开源码)

    https://www.tiobe.com/ (python语言排行榜) pip install pyinstaller pyinstaller test.py ./test

  9. syslog系统日志、Windows事件日志监控

  10. BP神经网络在python下的自主搭建梳理

    本实验使用mnist数据集完成手写数字识别的测试.识别正确率认为是95% 完整代码如下: #!/usr/bin/env python # coding: utf-8 # In[1]: import n ...