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 \ \ ...
随机推荐
- delete 指针
#include<iostream>using namespace std;class human{public: human(){cout<<"构造";} ...
- opencv如何用模板匹配寻找目标
首先使用: MatchTemplate 比较模板和重叠的图像区域 void cvMatchTemplate( const CvArr* image, const CvArr* templ, CvArr ...
- Android 微信分享信息
随着微信越来越火,越来越多的应用要求有分享到微信的功能.虽然有很多平台都帮集成有分享功能,比如友盟.但是个人觉得友盟集成的东西太多了,自己封装得太过分了,很多资源文件也要带进去,所以感觉不是怎么好,所 ...
- WIN ERROR:C:\Windows\System32\<LANG_NAME>\mstsc.exe.MUI
Issue: When you upgrade Win7, you may found your remote desktop will not work. You may get following ...
- Windows Azure 社区新闻综述(#69 版)
欢迎查看最新版本的每周综述,其中包含有关云计算和 WindowsAzure 的社区推动新闻.内容和对话. 以下是过去一周基于您的反馈汇集在一起的内容: 文章.视频和博客文章 · 使用 Azur ...
- MAX Average Problem(斜率优化dp)
MAX Average Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- SQL SERVER 中 实现主表1行记录,子表多行记录 整合成一条虚拟列
表中有这样的记录,简单的主子表,现要想通过left join 语句把两表关联起来 select * from tbl_diary_reback a left join tbl_diary_reback ...
- swipe方法
/** * @author zhousg * @Date 2016-02-04 * @Method 滑动方法 针对一个大容器内部的容器做滑动封装 * @param * args args.swipeD ...
- DOM元素对象的属性和方法(2)
11.contentEditable 作用:设置或返回元素内容可否编辑布尔值,HTML5新增属性 <!DOCTYPE html> <html> <head> < ...
- 蓝桥杯算法训练<二>
一.最小乘积(基本型)[这个题需要认真阅读试题,内容量较大,刚开始的时候,由于练习系统上给出的输入输出的格式有问题,没看懂,最后在MikCu的博客上看到了正确的格式,参考了代码,最终得到正确的结果.为 ...