c 两个数的最大公约数 辗转相除法的算法步骤 程序没有报错了但是一运行就是停止工作

下载作业帮安装包
扫二维码下载作业帮
1.75亿学生的选择
C语言程序:用“辗转相除法”求两个正整数的最大公约数(程序填空)
#include void main(){\x09int r,m,n,t;\x09scanf("%d%d",&m,&n);\x09if(m < n)\x09{\x09\x09n = n%m;\x09\x09r = m%n;\x09}\x09while(r)\x09{\x09\x09m =\x09\x09n =\x09\x09r = n%m;\x09}\x09printf("%d\n",n);}第一空为n = n%m;第二空为n%m;
为您推荐:
其他类似问题
扫描下载二维码&求最大公约数&简介
求两个数的最大公约数是一个非常经典的小程序,由用户输入两个数字,然后由程序计算出这两个数字的最大公约数,将结果返回给用户。初学者开始学习程序都会通过这样的小例子来熟悉程序的基本架构。这里,我们也通过一个小程序向大家展示,在Visual C++开发环境下实现这样一个小程序也是十分轻松的事情,同时会涉及到控件编辑、消息映射、控件变量设置、基本数据类型转换和计算等知识点。要创建的程序界面如图2.1所示。
图 2.1 &&求最大公约数&程序界面
&&求最大公约数&程序设计
下面开始一步一步地实现这个程序。首先,我们使用应用程序向导来创建这个程序框架。选择File|New命令,打开New对话框,在Projects标签中选择MFC AppWizard(exe),在Project Name文本框中输入MaxDivisor,然后单击&OK&按钮,如图2.2所示。然后,在随后出现的对话框中选择Dialog based,在下方选择&中文[中国]&,如图2.3所示。
图 2.2 &创建程序文件
图 2.3 &选择基于对话框的程序
在下面的几步中把一些不必要的选项都去掉,因为我们这个程序非常简单,不需要复杂的界面,如图2.4所示。然后单击Finish按钮,应用程序向导就自动产生了一个基于对话框的程序。下面对这个程序进行改造。首先,在工作区窗口中选择ResourceView,单击Dialog中的对话框资源,然后删掉应用程序向导生成的按钮和文本框,编辑产生我们自己的窗口,使其布局如图2.1。对于静态文本和按钮控件,单击鼠标右键,选择Properties选项,就可以编辑控件上的显示文字。然后我们用ClassWizard来添加消息映射和文本框变量,如图2.5所示。选中要添加的控件ID,然后在右面选择Add Variable按钮,就会弹出一个如图2.6所示的对话框,从中可以输入变量名、变量属性、变量的数据类型。这里,我们添加的3个变量都是整型数。另外,还要给第3个文本框添加一个额外的控件变量,如图2.7所示。
图 2.4 &撤选应用程序向导里面的选项
图 2.5 &添加变量
图 2.6 &添加值变量
图 2.7 &添加控件变量
现在,我们的程序框架已经基本完成,我们把&计算最大公约数&按钮的ID改为ID_COMPUTE,然后添加处理函数,如图2.8所示。然后单击Edit Code按钮,添加如下代码:
图 2.8 &添加处理函数
void CMaxDivisorDlg::OnCompute(){
& & UpdateData ();
& & n_Num1 = m_num1;
& & n_Num2 = m_num2;
& & if((n_Num1 &= 0) ||(n_Num2 &= 0))
& & & & ::AfxMessageBox (&请输入大于0的整数&);
& & & & &n_Result = Compute(n_Num1,n_Num2);
& & & & m_result = n_R
& & char sz[20];
& & sprintf(sz,&%d&,m_result);
& & m_CResult.SetWindowText (sz);
前面一部分代码用于输入的合法性检查,后面的代码调用一个Compute()函数,然后输出结果。Compute()函数是计算最大公约数的主体,代码如下:
int CMaxDivisorDlg::Compute(int a, int b){
& & int max,
& & max = a & b ? a :
& & min = a + b -
& & while( min ){
& & & & temp =
& & & & min = max %
& & & & max =
While里面的循环就是主要的计算程序,利用的是公约数的特性,是一个辗转相除的过程,稍微具备一点数学常识的人就能明白。计算结果如图2.9所示。
图 2.9 &计算结果显示
现在程序已经能够运行了,但读者单独完成时可能会遇到一些问题。下面说明两点,一是UpdateData()函数的应用。在基于对话框的程序中,当对话框上面的控件,尤其是文本框里面的内容发生改变时,我们需要调用UpdateData()函数进行更新,否则不能反映这些内容的变化。该函数有一个布尔型参数,False表示对话框刚开始创建,True表示对话框中的数据被刷新。二是字符串和基本数据类型,即数据格式间的转换问题。这也是初学者经常会遇到的问题,一般有3种办法可以解决:
◆ 1.用sprintf()函数来实现,即按照某种规定好的格式将数据写到字符串中。该函数原型如下:
& & int sprintf(char *buffer, const char *format [,argument] &);
使用方法如下:
#include &stdio.h&
void main( void ){
& & char buffer[200], s[] = &computer&, c = &#39;l&#39;;
& & int i = 35,
& & float fp = 1.7320534f;
& & /* Format and print various data: */
& & j = sprintf( buffer, &\tString: %s\n&, s );
& & j += sprintf( buffer + j, &\tCharacter: %c\n&, c );
& & j += sprintf( buffer + j, &\tInteger: %d\n&, i );
& & j += sprintf( buffer + j, &\tReal: %f\n&, fp );
& & printf( &Output:\n%s\ncharacter count = %d\n&, buffer, j );
String: computer
Character: l
Integer: 35
Real: 1.732053
character count = 71
◆ 2.使用CString类提供的Format()函数,也可以将数据按照某种规定格式写入字符串:
& & str.Format(&%d&,n);
这样也可以很简单地实现基本数据类型到字符串的转换。
◆ 3.用_itoa(),*_i64toa()系列函数,这是在程序中经常用到的小函数,其原型如下:
char *_itoa(int value,char *string,int radix );
char *_i64toa(__int64 value, char *string, int radix );
char * _ui64toa( unsigned _int64 value, char *string,int radix );
wchar_t * _itow(int value, wchar_t *string, int radix );
wchar_t * _i64tow( __int64 value, wchar_t *string, int radix );
wchar_t * _ui64tow(unsigned __int64 value, wchar_t *string, int radix);
使用方法如下:
void main( void ){
& & char buffer[20];
& & int i = 3445;
& & long l = -344115L;
& & unsigned long ul = UL;
& & _itoa( i, buffer, 10 );
& & printf( &String of integer %d (radix 10): %s\n&, i, buffer );
& &_itoa( i, buffer, 16 );
& &printf( &String of integer %d (radix 16): 0x%s\n&, i, buffer );
& &_itoa( i, buffer, 2 );
& &printf( &String of integer %d (radix 2): %s\n&, i, buffer );
& &_ltoa( l, buffer, 16 );
& &printf( &String of long int %ld (radix 16): 0x%s\n&, l, buffer );
& &_ultoa( ul, buffer, 16 );
& &printf( &String of unsigned long %lu (radix 16): 0x%s\n&, ul,buffer );
输出结果如下:
String of integer 3445 (radix 10): 3445
String of integer 3445 (radix 16): 0xd75
String of integer 3445 (radix 2):
String of long int -344115 (radix 16): 0xfffabfcd
String of unsigned long
(radix 16): 0x
这几种转换方式是非常常用的编程方法,在许多Visual C++程序中都要用到,读者应当熟练掌握,在程序中能很快地完成这些转换。查看: 4491|回复: 0
c语言 辗转相除法求两个正整数最大公约数
#include&stdio.h&//辗转相除法求两个正整数最大公约数,间接最小公倍数
void main()
int m,n,max,min,p,r;
printf(&please input two integers:(use comma to separate them)\n&);
scanf(&%d,%d&,&m,&n);
n=m;//有注释的程序容易被看懂,因为说的是人话,机器还没理解到那种程度,如果谁要是编一个中国人用的汉字程序就好了
m=p;//这一部分的作用就是n大m小
while(m!=0)//这里只能是m,因为r还没算出来
printf(&their greatest common divisor:%d\n&,n);
printf(&their leatest common multiple:%d\n&,max*min/n);
Powered by求两个整数的最大公约数的各种算法(C语言实现)
我的图书馆
求两个整数的最大公约数的各种算法(C语言实现)
& 求两个整数的最大公约数有两种算法——辗转相减法和辗转相除法,这两种算法的思想差不多,就是让这两个整数不断的减去最大公约数的倍数。辗转相减法的结束条件是这两个整数相等,此时这两个数的值就是最大公约数。辗转相除法的结束条件是两个数取模等于零,即一个数能整除另一数时,此时较小的数就是最大公约数。我用递归和非递归分别实现的这两种算法。程序采用C语言实现,已经在visual
上运行通过了,代码不是很简练,与大家分享学习经验了!
#include &stdio.h&
/*返回两个整数的最大公约数--辗转相减法递归实现*//*int greatCommonDivisor(int num1,int
num2){&if(num1&num2)&&return
greatCommonDivisor(num1-num2,num2);&else if(num1&num2)&&return
greatCommonDivisor(num1,num2-num1);&else&&return num1;}*/
/*返回两个整数的最大公约数--辗转相减法非递归实现*//*int greatCommonDivisor(int num1,int
num2){&while(1)&{&&if(num1&num2)&&&num1-=num2;&&else
if(num1&num2)&&&num2-=num1;&&else&&&return num1;&}}*/
/*返回两个整数的最大公约数--辗转相除法非递归实现*//*int greatCommonDivisor(int num1,int
num2){&while(num1*num2!=0)&{&&if(num1&num2)&&&num1%=num2;&&else
&&&num2%=num1;&}&return (num1==0?num2:num1);}*/
/*返回两个整数的最大公约数--辗转相除法递归实现*/int greatCommonDivisor(int num1,int
num2){&if(num1*num2==0)&&return
(num1==0?num2:num1);&if(num1&num2)&&return
greatCommonDivisor(num1%num2,num2);&else if(num1&num2)&&return
greatCommonDivisor(num2%num1,num1);}
void main(){&int a=14;&int b=21;&int
result=greatCommonDivisor(a,b);&printf("%d/n",result);}
发表评论:
TA的推荐TA的最新馆藏[转]&}

我要回帖

更多关于 辗转相除 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信