September 11th, 2004 — 8:36pm
方法1:根据基本算法编制函数
算法请参阅“基本算法:求最大数”专题。下面直接给出程序。
int my_max(int x,int y,int z)
{
int max;
max=x;
if(y>max)max=y;
if(z>max)max=z;
return max;
}
方法2: 用条件运算符
假设三个数存放在三个变量x,y,z中,可用下面的条件运算符求得最大数。
(1) 不用中间变量
x>y ? (x>z?x:z): ( y>z?y:z)
算法说明:先将x和y比较,若x>y,则最大数必定在x和z中间,因此再取x和z中的最大者;否则,最大数必定在y和z中间,因此就取y和z中的最大者。
(2) 用一个中间变量m
(m=x>y?x:y)>z?m:z
算法说明:先取x和y的最大者并赋值给m,然后求m和z中的最大者
(3) 不用中间变量
(x>y&&x>z)?x:(y>z?y:z)
算法说明:先看x是否比y和z都大,若是,x即为最大者,否则,最大者必定在y和z中间,因此就取y和z的最大者。
方法3:用宏
(1)定义带三个参数的宏
先定义如下带参数的宏
#define MAX(x,y,z) (((x)>(y)&&(x)>(y))?(x):((y)>(z)?(y):(z)))
然后在程序中使用上述宏替换即可。
注意:(1)上述宏定义中的每个形参及整个宏体都要加上小括号,原因请参阅“定义带参数的宏时,宏体中的形参为什么一定要加小括号?”专题。(2)该宏定义中使用了方法2中(3)的算法。也可以使用其中的(1)或(2)的算法来定义宏体。
(2)定义带二个参数的宏
#define MAX(x,y) ((x)>(y)?(x):(y))
使用时,应该这样:MAX(MAX(a,b),c),其中的a、b、c为实参,它的算法与方法2中的(2)是一样的。
Comment » | Uncategorized
September 11th, 2004 — 8:35pm
具体要求:给定若干数,编程求出其中最大数。
算法:
先定义一个变量max,用于存放最大数。具体算法如下:
(1)首先假设第一个数为最大数:将第一个数的值赋给max;
(2)然后将后面的数逐个与max比较,若大于max,则将值赋给max,否则继续下一个数的比较。
例程1:从键盘输入三个整数,求最大数并输出。
main()
{
int x,y,z,max;
scanf("%d%d%d",&x,&y,&z);
max=x;
if(y>max) max=y;
if(z>max) max=z;
printf("max=%d\n",max);
}
例程2:从键盘输入若干个整数(以0表示结束输入),求最大数并输出。
main()
{
int x,n=0,max;
scanf("%d",&x); /* 读入第一个数 */
max=x; /* 假设第一个数为最大数 */
while(x!=0)
{
n++; /* 对读入的数进行计数 */
if(x>max) max=x; /* 与max比较,并作相应处理 */
scanf("%d",&x); /* 读入下一个数 */
}
if(n)printf("max=%d\n",max);
else printf("no input"); /* 若读入的第一个数就为0,输出错误信息 */
}
例程3:编写函数,求数组a[N]中的最大数。
int my_max(int a[N])
{
int max,i;
max=a[0]; /* 假设第一个数为最大数 */
for(i=1;i<N;i++) /* 从第二个元素开始,逐个与max比较并作相应处理 */
if(a>max) max=a;
return max;
}
Comment » | Uncategorized
September 11th, 2004 — 8:35pm
具体要求:给定若干数,编程求出其中最小数。
算法:(与求最大数的算法完全类似)
先定义一个变量min,用于存放最小数。具体算法如下:
(1)首先假设第一个数为最小数:将第一个数的值赋给min;
(2)然后将后面的数逐个与min比较,若小于min,则将值赋给min,否则继续下一个数的比较。
例程1:从键盘输入三个整数,求最小数并输出。
main()
{
int x,y,z,min;
scanf("%d%d%d",&x,&y,&z);
min=x;
if(y<min) min=y;
if(z>min) min=z;
printf("min=%d\n",min);
}
例程2:从键盘输入若干个整数(以0表示结束输入),求最小数并输出。
main()
{
int x,n=0,min;
scanf("%d",&x); /* 读入第一个数 */
min=x; /* 假设第一个数为最小数 */
while(x!=0)
{
n++; /* 对读入的数进行计数 */
if(x<min) min=x; /* 与min比较,并作相应处理 */
scanf("%d",&x); /* 读入下一个数 */
}
if(n)printf("min=%d\n",min);
else printf("no input"); /* 若读入的第一个数就为0,输出错误信息 */
}
例程3:编写函数,求数组a[N]中的最小数。
int my_min(int a[N])
{
int min,i;
min=a[0]; /* 假设第一个数为最小数 */
for(i=1;i<N;i++) /* 从第二个元素开始,逐个与min比较并作相应处理 */
if(a<min) min=a;
return min;
}
Comment » | Uncategorized
September 11th, 2004 — 8:34pm
假设两个整数为x和y。
算法1:
(1)先求出x和y的最大公约数,并赋给变量r;
(2)x和y的最小公约数即为:x*y/r
程序如下:
int getm(int x,int y)
{
int r;
r=getcd(x,y);
return x*y/r;
}
该方法需调用求最大公约数函数。
算法2:
(1)将两数中较小的数放在x中,较大数保存在y中。
(2)判断y是否为x的整数倍,若是,则y就是最小公倍数,返回y;否则,继续。
(3)判断y的2倍数是否为x的整数倍,若是,则y的2倍数就是最小公倍数,返回y的2倍数;否则,继续将y的倍数逐步加大并进行判断,直到将y扩大x倍为止。
程序如下:
int getm(int x,int y)
{
int i,r;
if(x>y){r=x; x=y; y=r;}
for(i=1;i<=x;i++)
if((i*y)%x==0) break;
return i*y;
}
Comment » | Uncategorized
September 11th, 2004 — 8:34pm
假设两个正整数用u和v表示,算法采用辗转相除法,具体描述如下:
(1) 求出u%v的值并赋给变量r:r=u%v
(2) 进行迭代:u=v;v=r;
(3) 看v是否为0,若是,则u即为所要求的值,否则,转到(1)。
程序如下:
int getcd(int u,int v)
{
int r;
while(v!=0)
{
r=u%v;
u=v; v=r;
}
return u;
}
Comment » | Uncategorized