精华内容
下载资源
问答
  • 欧几里得辗转相除

    2014-02-11 11:16:13
    在我们编程中用的最多方法就是展转相除法了,展转相除法是古希腊求两个正整数的最大公约数的也叫欧几里德算法,用较大的数除以较小的数,结果的余数和被除数构成新的一对数,继续做上面的除法,直到大数被小数求尽,...

    展转相除法 
    在我们编程中用的最多方法就是展转相除法了,展转相除法是古希腊求两个正整数的最大公约数的也叫欧几里德算法,用较大的数除以较小的数,结果的余数和被除数构成新的一对数,继续做上面的除法,直到大数被小数求尽,这个较小的数就是最大公约数.以求288和123的最大公约数为例,操作如下: 
    (288,123)--(42,123)--(42,39)--(3,39)则3就是他们的最大公约数。

    程序如下:

    #include <stdio.h>

    int main() 

    int a, b, c; 
    printf("Please input two integers: "); 
    //输入两个整型数 
    scanf("%d %d", &a, &b); 
    //把大的数放前面,方便后面的循环 
    if(a<b) 

    c = a; 
    a = b; 
    b = c; 

    //循环,知道两个数相除余数为零 
    while(a % b != 0) 

    //求余数 
    c = a % b; 
    a = b; 
    b = c; 

    //打印出小的数,就是最大公约数 
    printf("%d", b); 
    //程序返回 
    return 0; 
    }

    展开全文
  • 若余数不为零,则将余数和较小的数构成新的一对数,继续上面的除法,直到大数被小数除尽,则这时较小的数就是原来两个数的最大公约数。 根据欧几里得的辗转相除法,gcd(a,b)有如下性质: 1.gcd(a,b)= gcd(b,a) 2....

    最大公约数:同时可以整除a和b(a和b不能全为零!)的公因数里最大的那个,可记作:gcd(a,b)

    辗转相除法:对于给定的两个数,用较大的数除以较小的数。若余数不为零,则将余数和较小的数构成新的一对数,继续上面的除法,直到大数被小数除尽,则这时较小的数就是原来两个数的最大公约数。

    根据欧几里得的辗转相除法,gcd(a,b)有如下性质:
    1.gcd(a,b)= gcd(b,a)
    2.gcd(a,b)=gcd(-a,b)
    3.gcd(a,0)=|a|
    4.gcd(a,b)=gcd(b,a%b),(0<=a%,b<b)

    public static void main(String[] args) {
            Scanner scanner=new Scanner(System.in);
            System.out.print("请输入一个数:");
            long  a=scanner.nextLong();
            System.out.print("请再输入一个数:");
            long  b=scanner.nextLong();
            System.out.print("gcd("+a+","+b+")=");
            long k;
    //        不用讨论a b 大小
    //        因为 一个小的数对大的数取余得的是小数本身,
    //        通过a=b,b=k 可以达到大小数互换从而继续取余
            do {
                k=a%b;
                a=b;
                b=k;
            }while (k!=0);
            System.out.println(a);
        }
    
    展开全文
  • 29. 两数相除

    2018-12-28 13:24:33
    方法一:可以将除法转移到对数域 ba=eln⁡ba=e(ln⁡b−ln⁡a)\frac{b}{a}={{e}^{\ln \frac{b}{a}}}={{e}^{(\ln b-\ln a)}}ab​=elnab​=e(lnb−lna) 有bug c++ code: class Solution { public: int divide(int...

    这是数学题题啊,老本行。

    方法一:可以将除法转移到对数域

    ba=elnba=e(lnblna)\frac{b}{a}={{e}^{\ln \frac{b}{a}}}={{e}^{(\ln b-\ln a)}}
    c++ code:

    class Solution {
    public:
    	int divide(int dividend, int divisor) {
    		if (divisor == 0)return 0;
    		double b = fabs(dividend);
    		double a = fabs(divisor);
    		long res = exp(log(b) - log(a));
    		if ((dividend > 0) ^ (divisor > 0)) res = -res;
    		if (res > INT_MAX)return INT_MAX;
    		if (res < INT_MIN) return INT_MAX;
    		return  res;
    	}
    };
    
    方法二:任何一个整数可以表示成以2的幂为底的一组基的线性组合.

    在这里插入图片描述
    分析:可以对被除数进行分解。以 10 和 3 为例,首先我们确定 3 的最高次系数,10&gt;32110 &gt; 3*{2^1}&&10&lt;32210 &lt; 3*{2^2},因此最高次系数为 2。然后我们用 10 减去3213*{2^1},继续进行刚才的过程,4&gt;3204 &gt; 3*{2^0}&&4&lt;3214 &lt; 3*{2^1},第二高次系数为 1。我们循环进行这个过程,直到最后的数小于除数为止,这些除数前面所有系数的和即为所求。注意类型一定是long long

    class Solution {
    public:
    	int divide(int dividend, int divisor) {
    		if (divisor == 0)return 0;
    		long long  b = fabs(dividend);
    		long long a = fabs(divisor);
    		long long res = 0;
    		long long cnt = 1;//系数
    		while (b >= a)
    		{
    			cnt = 1;
    			long long temp = a;
    			while (b>=(temp<<1))
    			{
    				temp <<= 1;
    				cnt <<= 1;
    			}
    			res += cnt;
    			b -= temp;
    		}
    		if ((dividend > 0) ^ (divisor > 0)) res = -res;
    		if (res > INT_MAX)return INT_MAX;
    		if (res < INT_MIN) return INT_MAX;
    		return  res;
    	}
    };
    

    [1]https://zhuanlan.zhihu.com/p/47708379

    展开全文
  • 辗转相除法证明及复杂度计算

    千次阅读 2016-08-30 17:45:54
    辗转相除法是计算两个数最大公约数(Greatest conmmon divisor)的一种对数复杂度算法。 问题:有两个正整数 x , y ,求 gcd(x,y): 算法证明: 设 x > y , 且 x = r + y * c , 其中 r >= 0, c >= 0 ; 1. if r = 0...

    辗转相除法是计算两个数最大公约数(Greatest conmmon divisor)的一种对数复杂度算法。

    问题:有两个正整数 x , y ,求 gcd(x,y):

    算法证明:

    设 x > y ,  且 x = r + y * c , 其中 r  >= 0, c >= 0 ;    

    1. if r = 0  then gcd( x,y) == y 为结束条件)

    2. if c = 0  then 算法没有前进

    3. if r > 0 && c >0 then r = x - c * y , 

    易知 : 如果d 为 x, y的公约数, 则必为r = x - c*y 的公约数 ,即 x,y 的公约数必为 y, r 的公约数;

    如果e 为 r和y的公约数, 有 r / e = x / e - c * y / e, r / e , c*y/e 为正整数, x / e 也为正整数,即y, r的公约数必为x,y的公约数;

    综上,x,y的最大公约数等价于y, r的最大公约数由此易得递归算法:

    int gcd ( int x, int y )
    {
    	if( x < y )
    		swap( x, y );
    	int r =  x % y;
    	if( r == 0 )
    		return y;
    	else
    		return gcd( y , r  );
    }
    int main()
    {
    	cout<< gcd( 9, 15 );
    }

    算法复杂度:设 x > y ,  且 x = r + y * c , 其中 r = x % y , c > 0 ;

            得:x > r *( c+1 ) >  2 * r ;   

            即: 经过两次迭代, x至少缩小一倍,算法复杂度为 2*log2(N);



    展开全文
  • 因为只能对正整数取对数,因此我们首先要将两个数都取绝对值,最后再加上符号。 同时,题目要求只能存储 32 位有符号整数,因此,当数据大于上边界时,需要进行特殊处理。 class Solution { public: int di...
  • 辗转相除法:对于给定的两个数,用较大的数除以较小的数。若余数不为零,则将余数和较小的数构成新的一对数。继续前面的除法,直到大数被小数除尽则这时较小的数就是原来两个数的最大公约数。 public int getResult...
  • 若余数不为零,则将余数和较小的数构成新的一对数,继续上面的除法,直到大数被小数除尽,则这时较小的数就是原来两个数的最大公约数。 二、更相减损术  (1)、《九章算术》中的更相减损术: 可半者半之,不...
  • 证明:性质八 真数相除就是指数相减(底数相同)
  • 题意:给定n对正整数ai,bi,请你求出每对数的最大公约数。 输入格式 第一行包含整数n。 接下来n行,每行包含一个整数对ai,bi。 输出格式 输出共n行,每行输出一个整数对的最大公约数。 数据范围 1≤n≤1e5, 1≤ai,bi...
  • Divide Two Integers 两数相除@LeetCode

    千次阅读 2013-11-23 14:27:23
    思路清晰,就是二倍法。...因为一个很大的数经过对数处理后都能在可接受的大小内。比如Integer.MAX_VALUE 的log后也不过31. 另外这道题很恶心的一点是在边界的处理,因为我们知道最大允许的负数的绝对值比最大允许的正
  • 图像的基本运算有很多种,比如两幅图像可以相加、相减、相乘、相除、位运算、平方根、对数、绝对值等; 图像也可以放大、缩小、旋转,还可以截取其中的一部分作为ROI(感兴趣区域)进行操作, 各个颜色通道还...
  • 递推计数问题题目总结

    千次阅读 2017-03-27 22:14:21
    introduction主要总结一些常用的递推计数技巧和题目.包括格点计数.树堆排列数目.... 枚举法,限定每个0的位置分类计数.UVA 10883 - Supermean 找规律,注意大数相除对数技巧codeforce 785D———
  • 几个著名而又非常有用的算法

    千次阅读 2016-08-05 19:54:11
    主要有辗转相除法、更相减损术、秦九韶算法、k进制化十进制的算法。 辗转相除的定义: 所谓辗转相除法,就是对于给定的两个数,用较大的数除以较小的数。若余数不为零,则将余数和较小的数构成新的一对数,继续...
  • 递归问题 --自己调用自己

    千次阅读 2016-10-26 14:14:25
    辗转相除法的解释:用较大的数M除以较小的数N,较小的数N和得出的余数R构成新的一对数,继续重复前面的除法(用较大的数除以较小的数),直到出现能够整除的两个数,其中较小的数(即除数)就是最大公约数。...
  • 数组的基本操作 常用的数组函数如下: 函数 描述 add() 两个数组元素相加 subtract() 两个数组元素相减 multiply() ...两个数组元素相除 ...返回自然对数、以2为底的对数、以10为底的对数
  • 1.3算法案例最新.ppt

    2020-09-12 17:35:38
    知识要点 辗转相除法欧几里得算法 所谓辗转相除法就是对于给定的两个数用较大的数除以较小的数若余数不为零则将余数和较小的数构成新的一对数继续上面的除法直到大数被小数除尽则这时较小的数就是原来两个数的最大公...
  • equations和values:equations中每个一维序列表示一对数进行相除(前 / 后),得到的结果就是values中相应位置的值,以上作为已知条件。 queries:包含两个元素,目的是要我们求:第一个元素 / 第二个元素 = ? 我们...
  • 分治法及一些杂项

    2020-04-26 21:19:09
    1.快排中的分治写法 会在其他题目中用到 2.看两个数是不是互质: 辗转相除 3.分治法写快速幂 4.求位数可以用10^k夹逼,然后用对数直接求
  • 辗转相除法是古希腊求两个正整数的最大公约数的算法,也叫欧几里德算法,其方法是用较大的数除以较小的数,上面较小的除数和得出的余数构成新的一对数,继续做上面的除法,直到出现能够整除的两个数,其中较小的数...
  • 题目一 求N个数的最大公约数和最小公倍数。用C或C++或java或python语言实现程序解决问题。...把N个数存入数组,依次对数组类的两个数进行辗转相除 程序流程图: 代码: import java.util.ArrayList; import ...
  • 辗转相除法是古希腊求两个正整数的最大公约数的,也叫欧几里德算法,其方法是用较大的数除以较小的数,上面较小的除数和得出的余数构成新的一对数,继续做上面的除法,直到出现能够整除的两个数,其中较小的数(即...
  • 辗转相除法是古希腊求两个正整数的最大公约数的,也叫欧几里德算法,其方法是用较大的数除以较小的数,上面较小的除数和得出的余数构成新的一对数,继续做上面的除法,直到出现能够整除的两个数,其中较小的数(即...
  • calc常用

    2014-04-18 11:41:17
    Mod求模(即整数相除求余数), And按位与, Or按位或, Xor按位异或, Lsh左移, Not按位取反, Int取整数部分 Pi是圆周率 Exp代表以e为幂指数函数例如:Exp10就是e的10次方; ln是以e为底的...
  • 指数对数 说明:在计算机科学中除非明确说明底,否则都是以2为底的。 级数模运算 去两个数相除取余数就是模运算,我们应该尽量少用模运算。 其它 欢迎加入交流群:451826376 更多信息:www.itcourse.top
  • 1、如何度量两个分布的相似度 kl散度,分布的对数差异的数学期望(两...相除形式>kl散度定义 3 、kl散度作为损失函数的模式塌陷问题:因为p(x)为其中一个分布的加权,所以不具有对称性,假设p(x) q(x)一个为...
  • matlab中常用运算函数

    2020-07-24 11:38:12
    matlab中常用运算函数 函数 运算法则 exp 求以e为底数的x次幂 log 求以e为底数x取对数 log10 求以10为底数对x求取对数 ...a与b相除取余弦 min(a,b) 返回a与b中较小的数值 max(a,b)
  • Matlab的运算符

    2017-06-09 10:49:43
    A./B A和B相应元素相除,A,B是同纬度的矩阵 A.^B A的B次幂,A为矩阵,B数值,A的每一个元素的B的次幂。 ③常用函数 exp(X) :e的x次幂 log(x):e为底数对x取对数 log10(x):10位底数对x取对数 sqrt(x):x的平方根 ...

空空如也

空空如也

1 2 3 4 5
收藏数 97
精华内容 38
关键字:

对数相除