Archive for September 11th, 2004


求三个数中最大者的几种方法

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

Back to top