常用算法举例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

常用算法举例
一、求面积、体积、方程的根,将公式的表达
式用变量或常量表示出来,输出即可;
二、累加、累乘(包括偶数和奇数的变换运算)
三、典型算法举例:
1、求两个数或三个数或多个数的最大值、最小值
思路:用表判断的if语句就可完成,也可使用函数的调用;
若是多个数,则采取从键盘上输入第一个数,并假定它
是最大值存放在变量max中,以后每输入一个数便与max
比较,若输入的数较大,则最大值是新的数值,存放到
max中,数据输入完,最大值也就确定了。

main( )
{
int a,b,c,d;
scanf(“%d,%d,%d”.&a,&b,&c);
d=max(a,b,c);
printf(“max=%d”,d);
}
int max(x,y,z)
int x,y,z;
{
int p;
p=x;
if (p<y) p=y;
if (p<z) p=z;
return(p);
}
求10个数的最大值
main( )
{
int I,k,max;
scanf(“%d”,&max);
for (I=2;I<11;I++)
{
scanf(“%d”,&k);
if (max<k) mzk=k;
}
printf(“max=%d\n”,max);
}
2、判断是否为闰年
思路:闰年应满足条件之一:
(a)能被4整除,但不能被100整除;
(b)能被4整除又能被400整除
main( )
{
int year,leap;
scanf("%d",&year);
if (year%4==0 )
{ if (year%100==0)
{if (year%400==0)
leap=1;
else leap=0;}
else
leap=1;}
else
leap=0;
if (leap)
printf(“%d is “,year);
else
printf(“%d is not”,year);
printf(“a leap year/n”);
}
此程序还可以简化用 (year%4==0 &&year%100!=0 || year%400==0)直接进行判断也可;此题还可求某范围内的闰年。

3、判断是否为素数
思路:一个自然数,若除了1和它本身外不能被其他整数整除,
则为素数。

如果M不能被2到SQRT(M)中的任何整数整除,则可
说明它是素数,当I>=SQRT(M)+1时结束循环。

#include “math.h”
main( )
{
int m,I,k;
scanf(“%d”,&m);
k=sqrt(m);
for (I=2;I<=k;I++)
if (m%I==0) break;
if (I>=k+1) printf(“%d is a prime number\n”,m);
else printf(“%d is not a prime number\n”,m);
}
此程序还可改成对某范围求全部素数:
#include “math.h”
main( )
{
int m,k,I,n=0;
for (m=101;m<=200;m=m+2)
{if (n%10==0) printf(“\n”);
k=sqrt(m);
for (I=2;I<=k;I++)
if (m%I==0) break;
if (I>=k+1)
{printf(“%d”,m);n=n+1;}
}
}
4、求最大公约数和最小公倍数
思路:若已知整数X和Y的最大公约数是K,则它们的最小公倍
数是x*y/k。

求解最大公约数有两种方法:
a.辗转相除法
两个数相除,若余数为0,则除数就是这两个数的最大公约数;
若余数不为0,则以除数作为新的被除数,以余数作为新的除
数,继续相除,直到余数为0,除数就是最大公约数。

main( )
{
int p,r,n,m,temp;
printf(“请输入两个整数n,m:”);
scanf(“%d,%d”,&n,&m);
if (n<m)
{temp=n;n=m;m=temp;}
p=n*m;
while (m!=0)
{r=n%m;n=m;m=r;}
printf(“最大公约数是%d”,n);
printf(“最小公倍数是%d”,p/n);
}
此题还可考虑如果输入时的m=0该如何处理。

b.相减法
两个数中从大数中减去小数,所得的差若与小数相等,则该数
为最大公约数;若不等,对所得的差和小数,继续从大数中减
去小数,直到两个数相等为止。

main( )
{
int x,y,a,b,t;
scanf(“%d,%d”,&x,&y);
a=x;b=y;
while (a!=b)
if (a>b) a=a-b;
else b=b-a;
printf(”%d,%d”,a,x*y/a);
}
5、求Fibonacci数列:1,2,3,5,8,……的前40个数,即
F1=1(n=1) F2=1(n=2) Fn=Fn-1+Fn-2 (n>=3)
main( )
{ long int f1,f2;
int I;
f1=1;f2=1;
for (I=1;I<=20;I++)
{
printf(“%12ld %12ld “,f1,f2);
if (I%2==0) printf(“\n”);
f1=f1+f2; f2=f2+f1;
}
}
6、输入某学生的成绩,输出该学生的成绩和等级(A级:90-100,
B级:80-89,C级:60-79,D级:0-59)
a.if语句
main( )
{
int x;
printf(“Please input x(0<=x<=100)\n”);
scanf(“%d”,&x);
if (x>100 ||x<0) printf(“x=%d data error!\n”,x);
else
if (x>=90) printf(“x=%d—A\n”,x);
else if (x>=80) printf(“x=%d—B\n”,x);
else if (x>=60) printf(“x=%d—C\n”,x);
else printf((“x=%d—D\n”,x);
}
b.switch语句
main( )
{
float x;
printf(“Please input x:\n);
scanf(“%f”,&x);
switch ((int)(x/10))
{
case 10:
case 9:printf(“x=%f—A\n”,x);break;
case 8:printf(“x=%f—B\n”,x);break;
case 7:
case 6:printf(“x=%f—C\n”,x);break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:printf(“x=%f—D\n”,x);break;
default:printf(“x=%f data error!\n”,x);
}
}
7、打印水仙花数
思路:“水仙花数”是指一个3位数字的立方和等于该数本身。

例:153=13+53+33
main( )
{
int I,j,k,n;
printf(““水仙花数”是:”);
for (n=100;n<1000;n++)
{
I=n/100; j=n/10-I*10;k=n%10;
if (n==I*I*I+j*j*j+k*k*k)
printf(“%4d”,n);
}
}
8、打印九九乘法表
例:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
思路:该题有列数、乘数的变化,而且其中一个乘数的变化跟另一个乘数有关。

main( )
{
int I,j;
for (I=1;I<=9;I++)
{
for (j=1;j<=I;j++)
printf(“%2d*%2d=%2d”,j,I,I*j);
printf(“\n”);
}
}
9、打印如下图案
* 思路:此题应考虑上、下两个三角形,其中有空格、 *** 行数、星号等参数的变化
*****
*******
*****
***
*
main( )
{
int I,j,k;
for (I=0;I<=3;I++)
{
for (j=0;j<=2-I;j++) printf(“”);
for (k=0;k<=2*I;k++) printf(“*”);
printf(“\n”);
}
for (I=0;I<=2;I++)
{
for (j=0;j<=I;j++) printf(“”);
for (k=0;k<=4-2*I;k++) printf(“*”);
printf(“\n”);
}
}
若图案居中,则可改为:
for (I=1;I<=4;I++)
{for (j=1;j<=31-I;j++) printf(“”);
for (k=1;k<=2*I-1;k++) printf(“*”);
printf(“\n”);}
10、S n=a+aa+aaa+…+aa..a,其中a是一个数字。

例如
2+22+222=?
main( )
{int a,n,I=1,sn=0,tn=0;
printf(“a,n=:”);
scanf(“%d,%d”,&a,&n);
while (I<=n)
{tn=tn+a;sn=sn+tn;a=a*10;I++;}
printf(“a+aa+aaa…=%d\n”,sn);}
11、给定一个不多于5位的正整数,要求:求它是几位数;分
别打印出每一位数字;按逆序打印各位数字。

例如:321要求输
出123
main()
{long int num;
int indiv,ten,hundred,thousand,ten_thousand,place;
printf(“请输入一个整数:”);
scanf(“%ld”,&num);
if (num>9999) place=5;
else if (num>999) place=4;
else if (num>99) place=3;
else if (num>9) place=2;
else place=1;
printf(“place=%d”,place);
printf(“每位数字为:”);
ten_thousand=(int)(num/10000);
thousand=(int)(num-ten_thousand*10000)/1000;
hundred=(int)(num-ten_thousand*10000-thousand*1000)/100;
ten=(int)(num-ten_thousand*10000-thousand*1000-hundred*1 00)/10;
indiv=(int)(num-ten_thousand*10000-thousand*1000-hundred *100-ten*10);
switch(place)
{case 5:
printf(“%d,%d,%d,%d,%d”,ten_thousand,thousand,hundred,te n,indiv);
printf(“\n 反序数字为:”);
printf(“%d%d%d%d%d%d\n”,indiv,ten,hundred,thousand,ten_t housand,);
break;
case 4:
……
}
}
12、完数:一个数如果恰好等于它的因子之和/ 方法一:
main( )
{
int m,s,I;
for (m=2;m<1000;m++)
{ s=0;
for (I=1;I<m;I++)
if ((m%I)==0) s=s+s+I;
if (s==m)
{printf(“%d是一个完数,它的因子是”,m);
for (I=1;I<=m;I++)
if (m%I==0) printf(“%d”,I);
printf(“\n”);
}
}
}
方法二:
#define M 1000
main( )
{int k1,k2,k3,k4,k5,k6,k7,k8,k9,k10;
int I,a,n,s;
for (a=2;a<=M;a++)
{n=0;s=a;
for (I=1;I<a;I++)
if (a%I==0)
{n++;s=s-I;
switch(n)
{case 1: k1=I;break;
case 2: k2=I;break;

case 10:k10=I;break;
}
}
if (s==0)
{printf(“%d its factors are”,a);
if (n>1) printf(“%d,%d”,k1,k2);
if (n>2) printf(“,%d”,k3);

if (n>9) printf(“,%d”,k10);
printf(“\n”);
}
}
}
方法三:运用数组。

相关文档
最新文档