求余数的各种方法

article/2025/11/10 14:17:02

1.辗转相除法辗转相除法(又名欧几里德法)
C语言中用于计算两个正整数a,b的最大公约数和最小公倍数,实质它依赖于下面的定理: a b=0 gcd(a,b) = gcd(b,a mod b) b!=0根据这一定理可以采用函数嵌套调用和递归调用形式进行求两个数的最大公约数和最小公倍数,现分别叙述如下:①函数嵌套调用其算法过程为: 前提:设两数为a,b设其中a 做被除数,b做除数,temp为余数1、大数放a中、小数放b中;2、求a/b的余数;3、若temp=0则b为最大公约数;4、如果temp!=0则把b的值给a、temp的值给a;5、返回第二步;
2.穷举法(利用数学定义)
穷举法(也叫枚举法)穷举法求两个正整数的最大公约数的解题步骤:从两个数中较小数开始由大到小列举,直到找到公约数立即中断列举,得到的公约数便是最大公约数 。①定义1:对两个正整数a,b如果能在区间[a,0]或[b,0]内能找到一个整数temp能同时被a和b所整除,则temp即为最大公约数。
3. 更相减损法
更相减损术,是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”更相减损术,是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
翻译成现代语言如下:
第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等 为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法。所以更相减损法也叫等值算法。
4.Stein算法 Stein算法由J. Stein 1961年提出,这个方法也是计算两个数的最大公约数。来研究一下最大公约数的性质,发现有 gcd( kx,ky ) = kgcd( x,y ) 这么一个非常好的性质。试取 k=2,则有 gcd( 2x,2y ) = 2 * gcd( x,y )。很快联想到将两个偶数化小的方法。那么一奇一个偶以及两个奇数的情况如何化小呢? 先来看看一奇一偶的情况: 设有2x和y两个数,其中y为奇数。因为y的所有约数都是奇数,所以 a = gcd( 2x,y ) 是奇数。根据2x是个偶数不难联想到,a应该是x的约数。我们来证明一下:(2x)%a=0,设2x=na,因为a是奇数,2x是偶数,则必有n是偶数。又因为 x=(n/2)*a,所以 x%a=0,即a是x的约数。因为a也是y的约数,所以a是x和y的公约数,有 gcd( 2x,y ) <= gcd( x,y )。因为gcd( x,y )明显是2x和y的公约数,又有gcd( x,y ) <= gcd( 2x,y ),所以 gcd( 2x,y ) = gcd( x,y )。至此,我们得出了一奇一偶时化小的方法。 再来看看两个奇数的情况:设有两个奇数x和y,不妨设x>y,注意到x+y和x-y是两个偶数,则有 gcd( x+y,x-y ) = 2 * gcd( (x+y)/2,(x-y)/2 ),那么 gcd( x,y ) 与 gcd( x+y,x-y ) 以及 gcd( (x+y)/2,(x-y)/2 ) 之间是不是有某种联系呢?为了方便设 m=(x+y)/2 ,n=(x-y)/2 ,容易发现 m+n=x ,m-n=y 。设 a = gcd( m,n ),则 m%a=0,n%a=0 ,所以 (m+n)%a=0,(m-n)%a=0 ,即 x%a=0 ,y%a=0 ,所以a是x和y的公约数,有 gcd( m,n )<= gcd(x,y)。再设 b = gcd( x,y )肯定为奇数,则 x%b=0,y%b=0 ,所以 (x+y)%b=0 ,(x-y)%b=0 ,又因为x+y和x-y都是偶数,跟前面一奇一偶时证明a是x的约数的方法相同,有 ((x+y)/2)%b=0,((x-y)/2)%b=0 ,即 m%b=0 ,n%b=0 ,所以b是m和n的公约数,有 gcd( x,y ) <= gcd( m,n )。所以 gcd( x,y ) = gcd( m,n ) = gcd( (x+y)/2,(x-y)/2 )。整理一下,对两个正整数 x>y :
1.均为偶数 gcd( x,y ) =2gcd( x/2,y/2 );
2.均为奇数 gcd( x,y ) = gcd( (x+y)/2,(x-y)/2 );
2.x奇y偶 gcd( x,y ) = gcd( x,y/2 );
3.x偶y奇 gcd( x,y ) = gcd( x/2,y ) 或 gcd( x,y )=gcd( y,x/2 );现在已经有了递归式,还需要再找出一个退化情况。注意到 gcd( x,x ) = x ,就用这个。
辗转相除法(嵌套)流程图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <time.h>
#define N 100
int m =1;
int Judge(int a,int b)
{if(sizeof(a)==4&&sizeof(b)==4){if(a>0&&b>0){return 1;} else{return 0;}}else{return 0;}
}
//辗转相除法
//嵌套
int divisor1(int a ,int b )
{    int temp,judge=(Judge(a,b));if(judge){while(temp=a%b){a=b;b=temp;}}else{return -1;}return b;
}
//递归
int divisor2(int a,int b)
{int temp,judge=(Judge(a,b));if(judge){if(temp=a%b){divisor2(b,temp);}else{return b;}}else{return -1;}
}
//穷举法
int divisor3(int a,int b){int i ,judge=(Judge(a,b));for(i=a<b?a:b;a%i||b%i;i--);return i;
}
//更相减损法
int divisor4(int a,int b){int k=1;while(!a%2&&!b%2){a/=2;b/=2;k*=2;}while(a-b){if(a<b){a=a+b;b=a-b;a=a-b;}a=a-b;}return b*k;
}
void swap(int * x,int * y){*x=*x+*y;*y=*x-*y;*x=*x-*y;
}
//Stein
//递归
int divisor5(int x,int y)
{   if(x==y){return x*m;}else if(!(x%2)){x=x/2;if(!(y%2)){y=y/2;m*=2;} }else{if(!(y%2)){swap(&x,&y);} else{if(x<y){swap(&x,&y);}x=(x+y)/2;y=x-y;}}divisor5(x,y);
}
//嵌套
int divisor6(int x,int y)
{   while(x-y){if(!(x%2)){x=x/2;if(!(y%2)){y=y/2;m*=2;} }else{if(!(y%2)){swap(&x,&y);}  else{if(x<y){swap(&x,&y);}x=(x+y)/2;y=x-y;}}}return x*m;
}
double test(int n)
{  int i,t;int data[100][2];clock_t start, finish; srand((unsigned)time(NULL));for(i=0;i<N;i++){data[i][0]=rand ()%2147483647;data[i][1]=rand ()%2147483647; }start = clock(); switch(n){case 1 :for(i = 0; i < N; i++){t = divisor1(data[i][0], data[i][1]);printf("%d,%d的最大公约数为:%d\n",data[i][0], data[i][1], t);}//end = clock();break;case 2:for(i = 0; i < N; i++){t = divisor2(data[i][0], data[i][1]);printf("%d,%d的最大公约数为:%d\n",data[i][0], data[i][1], t);}//end = clock();break;case 3:for(i = 0; i < N; i++){t = divisor3(data[i][0], data[i][1]);printf("%d,%d的最大公约数为:%d\n",data[i][0], data[i][1], t);}//end = clock();break;case 4:for(i = 0; i < N; i++){t = divisor4(data[i][0], data[i][1]);printf("%d,%d的最大公约数为:%d\n",data[i][0], data[i][1], t);m=1;}//end = clock();break;case 5:for(i = 0; i < N; i++){t = divisor5(data[i][0], data[i][1]);printf("%d,%d的最大公约数为:%d\n",data[i][0], data[i][1], t);m=1;}//end = clock();break;case 6:for(i = 0; i < N; i++){t = divisor6(data[i][0], data[i][1]);printf("%d,%d的最大公约数为:%d\n",data[i][0], data[i][1], t);}//end = clock();break;}finish = clock();return (double)(finish - start) / CLOCKS_PER_SEC;
} 
int main (void)
{ int n;printf("请输入要用的gcd函数的编号:");scanf("%d",&n);printf("%lfseconds\n",test(n));return 0;
}

http://chatgpt.dhexx.cn/article/3ZbdrG43.shtml

相关文章

matlab求余数

matlab求余数给出了两个函数&#xff1a;mod和rem&#xff0c;官方也给出了两者的区别&#xff1a; 根据需要选择合适的求余函数&#xff0c;记录一下。

rdnf-0.2

rdnf 0.2 思路 indradb indradb图数据库是基于kv存储引擎&#xff0c;主要是基于rocksdb。基本元素主要有三&#xff1a;Edge、Vertex、Property&#xff08;包含edge_property、vertex_property&#xff09;。 原理如下 VertexManager key&#xff1a;vertex.idvalue&#…

RDD是什么?

前言 本文隶属于专栏《1000个问题搞定大数据技术体系》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系 注意一些关于Spark Co…

AMD RDNA Architecture - AMD RDNA 架构

AMD RDNA Architecture - AMD RDNA 架构 https://www.amd.com/en/technologies/rdna Architected for Gaming - 为游戏而构建 The new RDNA architecture is designed for the next generation of efficient high-performance gaming. It’s the DNA that powers your games, …

Residual Dense Network for Image Super-Resolution(RDN)

摘要 1.问题背景&#xff1a;传统的深度CNN在图像超分辨率任务中取得了显著的成功&#xff0c;但是大部分基于深度CNN的SR模型没有充分利用来自原始低分辨率&#xff08;LR&#xff09;图像的层次特征&#xff0c;导致相对较低的性能。 2.创新点&#xff1a;为了解决这个问题…

一文带你初识RDMA技术——RDMA概念,特点,协议,通信流程

文章目录 1.RDMA概念2.RMDA与Socket2.1传统的TCP/IP通信2.2TCP/IP存在的问题 3.RDMA的特点3.1CPU offload3.2kernel bypass3.3zero copy3.4异步接口 4.RDMA通信协议InfiniBandRoCEiWARP 5.RDMA编程概述5.1传输操作5.2传输模式5.3相关概念5.4典型实例 6.RDMA通信过程6.1单向通信…

rDSN概览

原文链接&#xff1a;https://github.com/Microsoft/rDSN/wiki/overview rDSN(Robust Distributed System Nucleus)翻译成中文是高可用分布式系统核心&#xff0c;旨在提供一个健壮的、易于扩展、易于维护运营的分布式软件架构。对于分布式系统的开发人员来说&#xff0c;其提…

深度学习(二十二)——ESPCN, FSRCNN, VESPCN, SRGAN, DemosaicNet, MemNet, RDN, ShuffleSeg

https://antkillerfarm.github.io/ ESPCN ESPCN&#xff08;efficient sub-pixel convolutional neural network&#xff09;是创业公司Magic Pony Technology的Wenzhe Shi和Jose Caballero作品。该创业团队主要来自Imperial College London&#xff0c;目前已被Twitter收购。…

超分文章记录 SRCNN-FSRCNN-ESPCN-VDCN-DRCN-RDN-LapSRN-SRDenseNet-SRGAN

1.Learning a Deep Convolutional Network for Image Super-Resolution&#xff08;SRCNN 2014 ECCV &#xff09; 1、总结 第一篇用深度学习做超分的文章&#xff0c;就是用深度学习来表示传统方式。结构比较简单。 源码地址&#xff1a; SRCNN CODE 2、思路 先用 bicubic…

Introducing RDNA Architecture

Introducing RDNA Architecture The RDNA architecture white paper https://www.amd.com/system/files/documents/rdna-whitepaper.pdf The all new Radeon gaming architecture powering “Navi” 全新 Radeon 游戏架构为 Navi 提供动力 Table of Contents Introduction R…

Fluent案例:肾动脉RDN治疗过程的仿真

1 问题背景 肾动脉消融&#xff08;Renal denervation&#xff0c;简称RDN&#xff09;是一种治疗高血压的办法&#xff0c;其基本原理为利用插入肾动脉的电极消融导管进行射频消融&#xff0c;使肾动脉血管壁附近的交感神经因高温而损伤失活&#xff0c;减少神经系统过度活跃的…

LDAP 中的 RDN

什么是 RDN&#xff0c;RDN 和 DN 又有什么关系呢&#xff1f; 很多第一次接触到 LDAP 的童鞋&#xff0c;经常会被一堆名字搞得晕头转向。 RDN&#xff08;relative distinguished name&#xff09;中文翻译就是相对专有名字。 一般指dn逗号最左边的部分&#xff0c;如 cnb…

超分算法RDN:Residual Dense Network for Image Super-Resolution 超分辨率图像重建

这篇文章总结分析了ResNet 和DenseNet的优缺点&#xff0c;并将其结合&#xff0c;提出了新的结构ResidualDenseNet。文章中对ResNet 和DenseNet以及MemNet都进行了简单的对比分析。四篇原文都放在下面。 参考文档&#xff1a; RDN&#xff1a;https://arxiv.org/pdf/1802.0879…

图像超分算法小合集二:FSRCNN、DRCN、RDN、EDSR

目录 FSRCNNDRCNRDNEDSR 文章&#xff1a; FSRCNN : Accelerating the Super-Resolution Convolutional Neural Network DRCN: Deeply-Recursive Convolutional Network for Image Super-Resolution RDN: Residual Dense Network for Image Super-Resolution EDSR&#xff1a;E…

初识RDMA技术——RDMA概念,特点,协议,通信流程

1. RDMA概念 在DMA技术中&#xff0c;外部设备&#xff08;PCIe设备&#xff09;能够绕过CPU直接访问主机的系统主存&#xff1b; RDMA&#xff08;Remote Direct Memory Access&#xff09;在概念上是相对于DMA而言的。指外部设备能够绕过CPU&#xff0c;不仅可以访问本地主机…

【RDMA】技术详解(一):RDMA概述

目录 0、前言 一、技术背景 1 传统的 TCP/IP 网络通信的弊端 2 新的网络通信技术&#xff08;TOE and RDMA&#xff09; 2.1 TOE &#xff08;TCP/IP协议处理工作从CPU转移到网卡&#xff09; 2.2 RDMA &#xff08;绕过CPU&#xff0c;数据直接‘传’到对端内存&#xf…

Oriented rcnn

oriented rcnn代码解析 文章目录 rpn_head.forward_trainroi_head.forward_train class OrientedRCNN(RotatedTwoStageDetector) 类似rotated faster rcnn它们都继承两阶段检测器类。 所以训练的整体框架都如下&#xff1a; rpn_head.forward_train 代码主体&#x1f447; …

srcnn fsrcnn espcn rdn超分网络的结构

1.Srcnn Code&#xff1a; 数据集制作方法&#xff1a;以x2为例 训练数据&#xff1a;一张原始图作为高分辨率图像&#xff08;h, w&#xff09;&#xff0c;先下采样到&#xff08;h/2, w/2&#xff09;,然后再cubic上采样到&#xff08;h, w&#xff09;得到低分辨率图像&a…

RDD

RDD <1> 概述一. 什么是RDD二. spark 编程模型1. DataSource2. SparkContext3. Diver&#xff08;1&#xff09;SparkConf&#xff08;2&#xff09;SparkEnv&#xff08;3&#xff09;DAGScheduler&#xff08;4&#xff09;TaskScheduler&#xff08;5&#xff09;Sche…

RDNet

RDNet&#xff1a;Density Map Regression Guided Detection Network for RGB-D Crowd Counting and Localization IntroductionMethodExperiments Introduction Motivation&#xff1a;Regression-based方法有局限性&#xff0c;希望还是使用detection-based可以估计出每个人…