【C语言】最大公约数(更相减损法)和(辗转相除法)

#include<stdio.h>
#include <math.h>

/*
	编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。
例如:输入传入(0 , 5)函数返回5,传入(10 , 9)函数返回1,传入(12 , 4)函数返回4
*/

//更相减损法
int fuc(int m,int n)
{
	int i=0,temp,x;
	while(m%2==0 && n%2==0)  //判断m和n能被多少个2整除
	{
		m/=2;
		n/=2;
		i+=1;
	}
	if(m<n)     //m保存大的值
	{
		temp=m;
		m=n;
		n=temp;
	}
	while(x)
	{
		x=m-n;
		m=(n>x)?n:x;
		n=(n<x)?n:x;
		if(n==(m-n))
			break;
	}
	if(i==0)
		return n;
	else
		return (int )pow(2,i)*n;
}
//辗转相除法
int fuc2(int m,int n )
{
	int temp;
	if(m<n)
	{
		temp=m;
		m=n;
		n=temp;
	}
	while(n!=0)    //相除
	{
		temp=m%n;
		m=n;
		n=temp;
	}
	return m;
}

int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	printf("fuc:%d\n",fuc(m,n));
	printf("fuc2:%d\n",fuc2(m,n));
	return 0;
}

时间: 2024-10-24 11:21:16

【C语言】最大公约数(更相减损法)和(辗转相除法)的相关文章

C语言复习---获取最大公约数(辗转相除法和更相减损法)

源自:百度百科 辗转相除法 辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法. 例如,求(319,377): ∵ 319÷377=0(余319) ∴(319,377)=(377,319): ∵ 377÷319=1(余58) ∴(377,319)=(319,58): ∵ 319÷58=5(余29) ∴ (319,58)=(58,29): ∵ 58÷29=2(余0) ∴ (58,29)= 29: ∴ (319,377)=29. 用辗转相除法求几个数的最大公约数,可以先求出

求两个数的最大公约数,辗转相除法与更相减损法(递归迭代)

问题:给出两个数a和b,求出他们的最大公约数(greatest common divisor). 解法一:辗转相除法,又叫欧几里得算法.两个正整数a和b(a>b),他们的最大公约数等于a除以b的余数和b之间的最大公约数. 比如10和25,25除以10余5,那么10和25的最大公约数等同于5和10之间的最大公约数. //辗转相除法 递归解法 int gcd(int a,int b){ if(a%b==0) return b; return (b,a%b); } //辗转相除法 迭代解法int gc

BZOJ 1876: [SDOI2009]SuperGCD( 更相减损 + 高精度 )

更相减损,要用高精度.... --------------------------------------------------------------- #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> using namespace std; const int maxn = 10009; char S[maxn]; int Power[maxn]; stru

[SDOI2009][BZOJ1876] SuperGCD|高精度|更相减损术

1876: [SDOI2009]SuperGCD Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1970  Solved: 663[Submit][Status][Discuss] Description Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约 数)!因此他经常和别人比赛计算GCD.有一天Sheng bill很嚣张地找到了你,并要求和你比 赛,但是输给Sheng bill岂不是很丢脸!所以你决定写一个

更相减损术求最大公约数-C

可参照辗转相除 1 #include<stdio.h> 2 3 int main(void) 4 { 5 int x=260; 6 int y=104; 7 8 int temp; //临时变量 9 10 int index=0; 11 while((x%2==0)&&(y%2==0)) 12 { 13 x/=2; 14 y/=2; 15 ++index; 16 } 17 18 while(x!=y) 19 { 20 temp=x-y; 21 if(temp<y) 22

错位相减求和法

前言 等比数列的前\(n\)项的求和公式的推导方法,就是错位相减求和法. 适用范围 ①等比数列[基本]: ②差比数列[拓展]:错位相减求和法适用于由等差数列\(\{a_n\}\)和等比数列\(\{b_n\}\)对应相乘得到的差比数列\(\{a_n\cdot b_n\}\):比如有题目给定一个数列\(\{\cfrac{n}{2^n}\}\),我们先将其适当变形为\(\{n\cdot (\cfrac{1}{2})^n\}\),则可以看出其第一个因子数列\(a_n=n\)就是个等差数列,第二个因子数列

更新减损术的Java实现

先来介绍下这个名词的来源: 摘自百度百科: <九章算术>是中国古代的数学专著,其中的"更相减损术"可以用来求两个数的最大公约数,原文是:可半者半之,不可半者,副置分母.子之数,以少减多,更相减损,求其等也.以等数约之. 白话文译文: (如果需要对分数进行约分,那么)可以折半的话,就折半(也就是用2来约分).如果不可以折半的话,那么就比较分母和分子的大小,用大数减去小数,互相减来减去,一直到减数与差相等为止,用这个相等的数字来约分. 使用步骤 编辑 第一步:任意给定两个正整数

【C语言】两个指针(地址)相减

两个指针相减,为两个指针之间间隔这两个指针类型的数目. 如:int *p,*q; p-q=(p地址-q地址)/sizeof(int) #include <stdio.h> int main() { int a[9]={1,2,3,4,5,6,7,8,9}; char *p,*q; int *p2,*q2; p=(char*)a; q=(char*)&a[2]; printf("p=%08X q=%08X a[%d]=%d\n",p,q,q-p,a[q-p]); //

asp.net(C#)时间相减 得到天数、小时、分钟、秒差

asp.net(C#)时间相减 得到天数.小时.分钟.秒差 DateTime dtone = Convert.ToDateTime("2007-1-1 05:00:00"); DateTime dtwo = Convert.ToDateTime("2007-1-5 08:00:00"); TimeSpan span = dtone.Subtract(dtwo); //算法是dtone 减去 dtwo tss.Text = span.Days + "天&qu