poj1580---欧几里得算法(辗转相除法)
#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---欧几里得算法(辗转相除法)的更多相关文章
- js实现欧几里得算法
概念 在数学中,辗转相除法,又称欧几里得算法(英语:Euclidean algorithm),是求最大公约数的算法. 证明 首先假设有两个数a和b,其中a是不小于b的数,记a被b除的余数为r,那么a可 ...
- 扩展欧几里得算法(exGCD)学习笔记
@(学习笔记)[扩展欧几里得] 本以为自己学过一次的知识不会那么容易忘记, 但事实证明, 两个星期后的我就已经不会做扩展欧几里得了...所以还是写一下学习笔记吧 问题概述 求解: \[ax + by ...
- 扩展欧几里得算法(extgcd)
相信大家对欧几里得算法,即辗转相除法不陌生吧. 代码如下: int gcd(int a, int b){ return !b ? gcd(b, a % b) : a; } 而扩展欧几里得算法,顾名思义 ...
- noip知识点总结之--欧几里得算法和扩展欧几里得算法
一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a ...
- 最小公约数(欧几里得算法&&stein算法)
求最小公约数,最easy想到的是欧几里得算法,这个算法也是比較easy理解的,效率也是非常不错的. 也叫做辗转相除法. 对随意两个数a.b(a>b).d=gcd(a.b),假设b不为零.那么gc ...
- Python 最大公约数的欧几里得算法及Stein算法
greatest common divisor(最大公约数) 1.欧几里得算法 欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数. 其计算原理依赖于下面的定理: 两个整数的最大公约数等 ...
- 关于欧几里得算法(gcd)的证明
求a,b的最大公约数我们经常用欧几里得算法解决,也称辗转相除法, 代码很简短, int gcd(int a,int b){ return (b==0)?a:gcd(b,a%b); } 但其中的道理却很 ...
- 浅谈扩展欧几里得算法(exgcd)
在讲解扩展欧几里得之前我们先回顾下辗转相除法: \(gcd(a,b)=gcd(b,a\%b)\)当a%b==0的时候b即为所求最大公约数 好了切入正题: 简单地来说exgcd函数求解的是\(ax+by ...
- 『扩展欧几里得算法 Extended Euclid』
Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...
- 【LibreOJ】#6392. 「THUPC2018」密码学第三次小作业 / Rsa 扩展欧几里得算法
[题目]#6392. 「THUPC2018」密码学第三次小作业 / Rsa [题意]T次询问,给定正整数c1,c2,e1,e2,N,求正整数m满足: \(c_1=m^{e_1} \ \ mod \ \ ...
随机推荐
- 有结果集的mysqli函数获取行数和列数
<?php $mysqli=new mysqli("localhost", "root", "123456", "xsphp ...
- ListView多选操作模式——上下文操作模式
1.什么叫上下文操作模式 2.如何进入上下文操作模式 1.ListView自身带了单选.多选模式,可通过listview.setChoiceMode来设置: listview.setChoiceMod ...
- Ubuntu14.04安装Mongodb
官网获取到最新的tgz包: 请查看自己的cpu这里是32位的. $sudo wget htps://fastdl.mongodb.org/linux/mongodb-linux-i686-2.6.7. ...
- 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法(android)
final double x_pi = 3.14159265358979324 * 3000.0 / 180.0; public GeoPoint bd_encrypt(GeoPoint point) ...
- mysql_config_editor程序的用法
1.mysql_config_editor程序的作用: 它只是用来在用户的家目录下生成一个.mylogin.cnf 里面保存有用于登录mysql-server端的password,host,user信 ...
- Oracle EBS-SQL (PO-6):检查订单接收总数.sql
SELECT sum(rcvt.quantity) 接收事务处理汇总数--已排除退货 --rsh.receipt_num 收据号, --pov.vendor_nam ...
- android应用开发全程实录-你有多熟悉listview
http://blog.csdn.net/notice520/article/details/7040962 今天给大家带来<android应用开发全程实录>中关于listview和ada ...
- Thrift入门 (一)
Install Go to thrift page download thrift. 1 2 3 4 brew install boost ./configure --without-python s ...
- 解决Boost.Regex对中文支持不好的问题
解决Boost.Regex对中文支持不好的问题 - k.m.Cao - 博客频道 - CSDN.NET 解决Boost.Regex对中文支持不好的问题 k.m.Caov0.1 问题的提出: Boo ...
- Hibernate、乐观锁和悲观锁
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的关系型数据 ...