题目大意:将两个二进制数的GCD用二进制数表示出来。

题目分析:这道题可以用java中的大数类AC。

代码如下:

  1. import java.io*;
  2. import java.math.BigInteger;
  3. import java.util.Scanner;
  4.  
  5. public class Main {
  6. public static void main(String agrs[]){
  7. Scanner sc=new Scanner(System.in);
  8. int T=sc.nextInt();
  9. for(int i=1;i<=T;++i){
  10. String p=sc.next();
  11. String q=sc.next();
  12. BigInteger a=new BigInteger(p,2);
  13. BigInteger b=new BigInteger(q,2);
  14. a=a.gcd(b);
  15. System.out.print("Case #"+i+": ");
  16. System.out.println(a.toString(2));
  17. }
  18. sc.close();
  19. }
  20. }

  

不过,也可以用二进制来求GCD。

gcd(a,b)=gcd(a/2,b/2)*2 (a,b均为偶数)

gcd(a,b)=gcd(a,b/2) (a为奇数,b为偶数)

gcd(a,b)=gcd((a-b)/2,b) (a,b均为奇数)

很可惜我用C++没AC,下面是我没AC的代码:

  1. # include<iostream>
  2. # include<cstdio>
  3. # include<cstring>
  4. # include<algorithm>
  5. # include<string>
  6. using namespace std;
  7.  
  8. bool isBigger(string p,string q)
  9. {
  10. if(p.length()>q.length()) return true;
  11. else if(p.length()<q.length()) return false;
  12. else{
  13. int len=p.length();
  14. for(int i=len-1;i>=0;--i){
  15. if(p[i]>q[i]) return true;
  16. else if(p[i]<q[i]) return false;
  17. }
  18. }
  19. }
  20.  
  21. string sub(string p,string q)
  22. {
  23. int len=q.length();
  24. for(int i=0;i<len;++i){
  25. if(p[i]>=q[i])
  26. p[i]=p[i]-q[i]+'0';
  27. else{
  28. p[i+1]-=1;
  29. p[i]=p[i]+2-q[i]+'0';
  30. }
  31. }
  32. for(int i=len;i<p.length();++i){
  33. if(p[i]<'0'&&i+1<p.length()){
  34. --p[i+1];
  35. p[i]+=2;
  36. }
  37. }
  38. len=p.length();
  39. while(p[len-1]<='0'&&len>0)
  40. --len;
  41. return p.substr(0,len);
  42. }
  43.  
  44. string f(string p,string q)
  45. {
  46. if(p==q) return p;
  47. if(p=="1") return "1";
  48. if(q=="1") return "1";
  49. int n=p.length(),m=q.length();
  50. if(p[0]=='0'&&q[0]=='0')
  51. return f(p.substr(1,n-1),q.substr(1,m-1))+'0';
  52. else if(p[0]=='1'&&q[0]=='0')
  53. return f(p,q.substr(1,m-1));
  54. else if(p[0]=='0'&&q[0]=='1')
  55. return f(p.substr(1,n-1),q);
  56. else{
  57. if(isBigger(p,q)){
  58. p=sub(p,q);
  59. n=p.length();
  60. return f(p.substr(1,n-1),q);
  61. }else{
  62. q=sub(q,p);
  63. m=q.length();
  64. return f(p,q.substr(1,m-1));
  65. }
  66. }
  67. }
  68.  
  69. int main()
  70. {
  71. int T;
  72. string p,q;
  73. scanf("%d",&T);
  74. for(int i=1;i<=T;++i){
  75. cin>>p>>q;
  76. reverse(p.begin(),p.end());
  77. reverse(q.begin(),q.end());
  78. cout<<"Case #"<<i<<": "<<f(p,q)<<endl;
  79. }
  80. return 0;
  81. }

  

HDU-5050 Divided Land (二进制求GCD)的更多相关文章

  1. hdu----(5050)Divided Land(二进制求最大公约数)

    Divided Land Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

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

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

  3. Hdu 5050 Divided Land

    题目要求就是做求两个二进制数的gcd,如果是用java的话,这题很简单.但也可以用C++做,只能先给自己留下这个坑了,还在研究c++的做法. import java.math.BigInteger; ...

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

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

  5. HUD 5050 Divided Land

    http://acm.hdu.edu.cn/showproblem.php?pid=5050 题目大意: 给定一个矩形的长和宽,把这个矩形分成若干相等的正方形,没有剩余.求正方形的边长最长是多少. 解 ...

  6. HDU5050:Divided Land(大数的进制转化与GCD)

    题意:给定大数A和B,求gcd.所有数字都是二进制. 思路:先输入字符串,再转化为大数,然后用大数的gcd函数,最后转化为字符串输出. 利用字符串和大数转化的时候可以声明进制,就很舒服的完成了进制转化 ...

  7. 二进制求最大公约数&&输出二进制

    Divided Land Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot ...

  8. hdu 1255 覆盖的面积(求覆盖至少两次以上的面积)

    了校赛,还有什么途径可以申请加入ACM校队?  覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  9. [洛谷P1029]最大公约数与最小公倍数问题 题解(辗转相除法求GCD)

    [洛谷P1029]最大公约数与最小公倍数问题 Description 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P, ...

随机推荐

  1. python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  2. Linux中Postfix邮件安装配置(二)

    本套邮件系统的搭建,从如何发邮件到收邮件到认证到虚拟用户虚拟域以及反病毒和反垃圾邮件等都有详细的介绍.在搭建过程中必须的参数解释以及原理都有告诉,这样才能更好地理解邮件系统. 卸载自带postfix ...

  3. TED #10# A rite of passage for late life

    Bob Stein: A rite of passage for late life Collection I grew up white, secular and middle class in 1 ...

  4. 20165310 java_blog_week4

    2165310 <Java程序设计>第4周学习总结 教材学习内容总结 继承(extends) 同一个包内:继承除了private修饰的变量与方法 不同包内:不继承private和友好,继承 ...

  5. 20165310java_blog_week7

    2165310 <Java程序设计>第7周学习总结 教材学习内容总结 通过JDBC管理数据库 原理图: 链接数据库方式 - `Connection getConnection(java.l ...

  6. MIME协议(详解范例)

    转载一:http://blog.csdn.net/bripengandre/article/details/2192982 转载二:http://blog.csdn.net/flfna/article ...

  7. Python3基础 delattr 删除对象的属性

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  8. Unity3D学习笔记(二十五):文件操作

    文件是什么? 存储在硬盘上的最后的节点. 文件夹是什么? 文件的上级单位称为文件夹. 文件夹的基本结构? 文件夹是层级化结构的,对于同级的文件夹不可以重名,父文件夹和子文件夹可以同名> IO:I ...

  9. Git operate

    新建远程分支和删除 https://www.jianshu.com/p/ea1dab2de419 使用git branch -a查看所有分支 远程先开好分支然后拉到本地 git checkout -b ...

  10. EasyUI ---- draggable购物车

    @{ ViewBag.Title = "Easyui_draggable"; Layout = "~/Views/Shared/Layouts.cshtml"; ...