#include<stdio.h>
#include<string.h>
#include<string.h>
char str1[],str2[];
int len;
int cal(char *str1,char *str2)
{
int ret=,i;
for(i=;str1[i]&&str2[i];i++)
{
if(str1[i]==str2[i])
ret++;
}
return ret;
} int max(int a, int b)
{
int z;
z=(a>b)?a:b;
return z;
} int gcd(int a, int b)
{
if(a==)
return ;
if(a%b==)
return b;
else
{
return gcd(b,(a%b));
}
}
/*
int gcd(int a, int b)
{
if(a==0)
return 1;
while(1)
{
int r=a%b;
if(r==0)
return b;
else
{
a=b;
b=r;
}
}
}*/
int findLargest(char *str1,char *str2)
{
int i,j;
int len1=strlen(str1);//len1 len2放在调用函数里,节省时间,不至于RE
int len2=strlen(str2);
len=len1+len2;
int ret=cal(str1,str2);
for(i=;i<len1;i++)
{
ret=max(ret,cal(str1+i,str2));
}
for(j=;j<len2;j++)
{
ret=max(ret,cal(str1,str2+j));
}
return ret;
} int main()
{
int ans;
while(scanf("%s",str1),strcmp(str1,"-1"))//输入-1,,存入数组的是两个字符
{
int g;
scanf("%s",str2);
ans=findLargest(str1,str2);
ans*=;
g=gcd(ans,len);
ans/=g;
len/=g;
if(ans==)
printf("appx(%s,%s) = %d\n",str1,str2,);
else if(len==)
printf("appx(%s,%s) = %d\n",str1,str2,ans);
else
printf("appx(%s,%s) = %d/%d\n",str1,str2,ans,len);
}
return ;
}

欧几里得算法,自己写的:

int gcd(int a, int b)
{
if(a==)
return ;
while()
{
int r=a%b;
if(r==)
return b;
else
{
a=b;
b=r;
}
}
}

递归方法写的:

int gcd(int a, int b)
{
if(a==)
return ;
if(a%b==)
return b;
else
{
return gcd(b,(a%b));
}
}

欧几里得算法又叫辗转相除法,用来求最大公约数,greatest common divisor最大公约数,gcd代表函数名

算法描述:1.设a%b=r,如果r==0,b即为最大公约数,返回b,2否则a<--b,b<--r,重复第一步

有可能gcd(int a ,int b),分子为0,return 1,o和任何正数的最大公约数为1,分数约分后,判断如果分子为0,直接输出0

如果分母为1,表示,分子比分母大,输出分子就行,题目中只可能是用于fraction值为1的情况

有些欧几里得算法描述里要求如果a<b交换值,其实不然,在上面两种算法里,a=3,b=13

a%b=3 != 0,按照欧几里得算法描述,a<--b,b<--r,a=13,b=3。实际上不用换值,循环的第二次,或者递归的第二重

也会变成13%3,因此欧几里得算法适用于不论分子大还是分母大的情况

该算法结束的条件为a%b==0,返回b的值

RE了几次,之前将len1,len2弄成全局变量,RE,后来将len1,len2,放在findLargest函数里充当临时变量,留len一个全局

应该是节省了不少的空间,可见:全局变量的使用要慎重

除了这个算法之外,本题思路:

cal(char *str1, char *str2)从传入的地址开始字符串左对齐findLargest里面的第一个for循环:

    C A R  
    C A R T
  C A R    
    C A R T
  C A R      
      C A R T

第二

    C A R  
    C A R T

        C A R
      C A R T

poj1580---欧几里得算法(辗转相除法)的更多相关文章

  1. js实现欧几里得算法

    概念 在数学中,辗转相除法,又称欧几里得算法(英语:Euclidean algorithm),是求最大公约数的算法. 证明 首先假设有两个数a和b,其中a是不小于b的数,记a被b除的余数为r,那么a可 ...

  2. 扩展欧几里得算法(exGCD)学习笔记

    @(学习笔记)[扩展欧几里得] 本以为自己学过一次的知识不会那么容易忘记, 但事实证明, 两个星期后的我就已经不会做扩展欧几里得了...所以还是写一下学习笔记吧 问题概述 求解: \[ax + by ...

  3. 扩展欧几里得算法(extgcd)

    相信大家对欧几里得算法,即辗转相除法不陌生吧. 代码如下: int gcd(int a, int b){ return !b ? gcd(b, a % b) : a; } 而扩展欧几里得算法,顾名思义 ...

  4. noip知识点总结之--欧几里得算法和扩展欧几里得算法

    一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a  ...

  5. 最小公约数(欧几里得算法&amp;&amp;stein算法)

    求最小公约数,最easy想到的是欧几里得算法,这个算法也是比較easy理解的,效率也是非常不错的. 也叫做辗转相除法. 对随意两个数a.b(a>b).d=gcd(a.b),假设b不为零.那么gc ...

  6. Python 最大公约数的欧几里得算法及Stein算法

    greatest common divisor(最大公约数) 1.欧几里得算法 欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数. 其计算原理依赖于下面的定理: 两个整数的最大公约数等 ...

  7. 关于欧几里得算法(gcd)的证明

    求a,b的最大公约数我们经常用欧几里得算法解决,也称辗转相除法, 代码很简短, int gcd(int a,int b){ return (b==0)?a:gcd(b,a%b); } 但其中的道理却很 ...

  8. 浅谈扩展欧几里得算法(exgcd)

    在讲解扩展欧几里得之前我们先回顾下辗转相除法: \(gcd(a,b)=gcd(b,a\%b)\)当a%b==0的时候b即为所求最大公约数 好了切入正题: 简单地来说exgcd函数求解的是\(ax+by ...

  9. 『扩展欧几里得算法 Extended Euclid』

    Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...

  10. 【LibreOJ】#6392. 「THUPC2018」密码学第三次小作业 / Rsa 扩展欧几里得算法

    [题目]#6392. 「THUPC2018」密码学第三次小作业 / Rsa [题意]T次询问,给定正整数c1,c2,e1,e2,N,求正整数m满足: \(c_1=m^{e_1} \ \ mod \ \ ...

随机推荐

  1. Jsoup小Demo

    Jsoup小Demo public class JsoupUtil { public void parseWangYi() { Document doc = null; try { //eg1:解析百 ...

  2. struts2笔记11-OGNL

    1.OGNL Object-Graph Navigation Language,对象-图 导航语言,可以方便的操作struts2值栈对象 2.对象栈操作方法 (1)action普通属性的访问方法 &l ...

  3. 嵌入式平台组件白盒测试gcov、lcov和genhtml 使用指导

    在嵌入式平台上使用了gtest白盒测试工具,覆盖了被测函数,但是不知道自己测试的效果如何,测试行覆盖率.函数覆盖率,分支覆盖率的数据. 便开始研究gcov这个代码覆盖率工具能否使用,来检查白盒测试的效 ...

  4. skynet的流程1

    logpath = "."harbor = 1address = "127.0.0.1:2526"master = "127.0.0.1:2013&q ...

  5. Codeforces 241B

    因为博客园的公式编辑有点坑,所以-- 原题

  6. SVG 教程

    SVG 意为可缩放矢量图形(Scalable Vector Graphics). SVG 使用 XML 格式定义图像. 现在开始学习 SVG! <html> <body> &l ...

  7. ostream类的公有成员函数

    1 flush 2 operator<< 3 put 4 seekp 5 tellp 6 write 1 flush 刷新输出流 2 operator<< 插入运算符 3 pu ...

  8. 用python处理文本数据 学到的一些东西

    最近写了一个python脚本,用TagMe的api标注文本,并解析返回的json数据.在这个过程中遇到了很多问题,学到了一些新东西,总结一下. 1. csv文件处理 csv是一种格式化的文件,由行和列 ...

  9. 30分钟学会使用grunt打包前端代码【mark】

    grunt 是一套前端自动化工具,一个基于nodeJs的命令行工具,一般用于:① 压缩文件② 合并文件③ 简单语法检查 对于其他用法,我还不太清楚,我们这里简单介绍下grunt的压缩.合并文件,初学, ...

  10. php将文件夹打包成zip文件

    function addFileToZip($path,$zip){    $handler=opendir($path); //打开当前文件夹由$path指定.    while(($filenam ...