求N个数的最大公约数和最小公倍数(C语言实现)
一、题目分析:
基本要求为:求N个数的最大公约数和最小公倍数,用C或C++或java或python语言实现程序解决问题;提高要求为:Hankson问题。
基本要求较为简单,是对GCD算法的进一步运用,与第一次上机作业有相似之处,选择辗转相除法求解最大公约数,用求解的最大公约数和整数乘积计算最小公倍数并输出。
二、 算法思路:
求N个数的最大公约数和最小公倍数,要求为N个数,所以选择数组存储N个数的数值,使用随机函数对用户要求的整数个数进行赋值,将随机函数生成的N个数存入数组中。后对数组中的数进行运算,用for循环运行n+1次辗转相除法求得最大公约数,再根据数学定义,求得数组所有数的乘积除以最大公约数。
三、 源代码:
基本要求:
#include<stdio.h>
#include<stdlib.h> //随机生成函数头文件
void main()
{
int i,k,m,n;
int a,b,temp,r;
int w[101];
printf("Please
input the quantity of integer:"); //输入整数数量
scanf("%d",&n);
for(i=1;i<n+1;i++) //利用随机函数给n个整数赋值
{
w[i]=1+rand()%100;
printf("No.%d is %d,\n",i,w[i]);
}
b=w[1];
for(k=1;k<n+1;k++) //使用n+1次辗转相除法以求n个数的最大公约数
{ a=w[k];
if(a<b)
temp=a;a=b;b=temp;
r=a%b;
while(r!=0) //辗转相除法
{
a=b;
b=r;
r=a%b;
}
}
for(i=1;i<n+1;i++)
{
m=m*w[i];
}
printf("The highest common divisor is %d\n",b); //输出最大公约数
printf("The least common multiple is %d\n",m/b); //输出最小公倍数
}
四、调试截图
五、 测试截图:
六、总结:
本周的作业,使得我对GCD算法有了更深层次的理解,熟练了对辗转相除法的应用,将前后两周所学相结合,对于for循环、数组、随机函数的运用更加熟练,算法设计变得更加简洁明了。并运用了VC++6.0对程序模块进行调试。
但是提高要求未能达成,从网上找了相应的实现代码进行学习后,对于提高要求中的Hankson问题有了初步的理解,但是独立进行代码实现较为拙劣,希望下次对于复杂问题能有更深层次的见解。