一:题目分析
基本要求:求N个数的最大公约数和最小公倍数。用C或C++或java或python语言实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.提供友好的输入输出,并进行输入数据的正确性验证。
提高要求:已知正整数a0,a1,b0,b1,设某未知正整数x满足:
1、 x和a0的最大公约数是a1;
2、 x和b0的最小公倍数是b1。
求得X的个数。
样例输入
2
41 1 96 288
95 1 37 1776
样例输出
6
2
二:题目分析与算法实现
1 用辗转相除法函数嵌套调用实现求俩数的最大公约数和最小公倍数,代码如下:
int divisor (int a,int b) //自定义函数求两数的最大公约数
{
int temp; //定义整型变量
if(a<b) //通过比较求出两个数中的最大值和最小值
{ temp=a;a=b;b=temp;} //设置中间变量进行两数交换
while(b!=0) //通过循环求两数的余数,直到余数为0
{
temp=a%b;
a=b; //变量数值交换
b=temp;
}
return (a); //返回最大公约数到调用函数处
}
int multiple (int a,int b) //自定义函数求两数的最小公倍数
{
int divisor (int a,int b); //自定义函数返回值类型
int temp;
temp=divisor(a,b); //再次调用自定义函数,求出最大公约数
return (a*b/temp); //返回最小公倍数到主调函数处进行输出
}
2 对提高要求
void main()
{
int n,i,j,y,x,k;
scanf("%d",&n);
int a[n][4]; //建立二维数组
for(j=0;j<n;j++) //输入多行数据
for(i=0;i<4;i++) //输入一行数据
scanf("%d",&a[j][i]);
for(k=0;k<n;k++){
y=0;
x=a[k][1];
for(x=a[k][1];x<=a[k][3];x++){
if(divisor(a[k][0],x)==a[k][1]&&multiple(x,a[k][2])==a[k][3]) //判断是否符合要求
y++;
}
printf("%d\n",y);
}
}
三: 算法实现
1 源代码如下:
#include "stdio.h"
int divisor (int a,int b) //自定义函数求两数的最大公约数
{
int temp; //定义整型变量
if(a<b) //通过比较求出两个数中的最大值和最小值
{ temp=a;a=b;b=temp;} //设置中间变量进行两数交换
while(b!=0) //通过循环求两数的余数,直到余数为0
{
temp=a%b;
a=b; //变量数值交换
b=temp;
}
return (a); //返回最大公约数到调用函数处
}
int multiple (int a,int b) //自定义函数求两数的最小公倍数
{
int divisor (int a,int b); //自定义函数返回值类型
int temp;
temp=divisor(a,b); //再次调用自定义函数,求出最大公约数
return (a*b/temp); //返回最小公倍数到主调函数处进行输出
}
void main()
{
int N,i;
printf("请输入N的个数:");
scanf("%d",&N);
printf("请输入数字:");
int a[N];
for(i=0;i<N;i++)
scanf("%d",&a[i]);
int x,y;
x=a[0];
for(i=1;i<N;i++)
{
y=a[i];
x=divisor(x,y);
}
printf("这N个数的最大公约数为:%d\n",x);
x=a[0];
for(i=1;i<N;i++)
{
y=a[i];
x=multiple(x,y);
}
printf("这N个数的最大公约数为:%d\n",x);
}
2 源代码如下
#include<stdio.h>
int divisor (int a,int b) //求最大公约数
{
int temp;
if(a<b)
{ temp=a;a=b;b=temp;}
while(b!=0)
{
temp=a%b;
a=b;
b=temp;
}
return (a);
}
int multiple (int a,int b) //求最小公倍数
{
int temp;
temp=divisor(a,b);
return (a*b/temp);
}
void main()
{
int n,i,j,y,x,k;
scanf("%d",&n);
int a[n][4]; //建立二维数组
for(j=0;j<n;j++) //输入多行数据
for(i=0;i<4;i++) //输入一行数据
scanf("%d",&a[j][i]);
for(k=0;k<n;k++){
y=0;
x=a[k][1];
for(x=a[k][1];x<=a[k][3];x++){
if(divisor(a[k][0],x)==a[k][1]&&multiple(x,a[k][2])==a[k][3]) //判断是否符合要求
y++;
}
printf("%d\n",y);
}
}
四:归纳总结
本次设计采用辗转相除法函数的嵌套使用,算法构造比较简单,在主函数中使用嵌套调用即可完成基本要求。
对于提高要求,使用二维数组输入多行数据,在循环中判断X是否符合要求即可。