常用算法举例.docx
《常用算法举例.docx》由会员分享,可在线阅读,更多相关《常用算法举例.docx(13页珍藏版)》请在冰豆网上搜索。
常用算法举例
常用算法举例
一、求面积、体积、方程的根,将公式的表达式用变量或常量表示出来,输出即可;
二、累加、累乘(包括偶数和奇数的变换运算)
三、典型算法举例:
1、求两个数或三个数或多个数的最大值、最小值
思路:
用表判断的if语句就可完成,也可使用函数的调用;
若是多个数,则采取从键盘上输入第一个数,并假定它是最大值存放在变量max中,以后每输入一个数便与max比较,若输入的数较大,则最大值是新的数值,存放到max中,数据输入完,最大值也就确定了。
main()
{
inta,b,c,d;
scanf(“%d,%d,%d”.&a,&b,&c);
d=max(a,b,c);
printf(“max=%d”,d);
}
intmax(x,y,z)
intx,y,z;
{
intp;
p=x;
if(pif(preturn(p);
}
求10个数的最大值
main()
{
intI,k,max;
scanf(“%d”,&max);
for(I=2;I<11;I++)
{
scanf(“%d”,&k);
if(max}
printf(“max=%d\n”,max);
}
2、判断是否为闰年
思路:
闰年应满足条件之一:
(a)能被4整除,但不能被100整除;
(b)能被4整除又能被400整除
main()
{
intyear,leap;
scanf("%d",&year);
if(year%4==0)
{if(year%100==0)
{if(year%400==0)
leap=1;
elseleap=0;}
else
leap=1;}
else
leap=0;
if(leap)
printf(“%dis“,year);
else
printf(“%disnot”,year);
printf(“aleapyear/n”);
}
此程序还可以简化用(year%4==0&&year%100!
=0||year%400==0)直接进行判断也可;此题还可求某范围内的闰年。
3、判断是否为素数
思路:
一个自然数,若除了1和它本身外不能被其他整数整除,则为素数。
如果M不能被2到SQRT(M)中的任何整数整除,则可说明它是素数,当I>=SQRT(M)+1时结束循环。
#include“math.h”
main()
{
intm,I,k;
scanf(“%d”,&m);
k=sqrt(m);
for(I=2;I<=k;I++)
if(m%I==0)break;
if(I>=k+1)printf(“%disaprimenumber\n”,m);
elseprintf(“%disnotaprimenumber\n”,m);
}
此程序还可改成对某范围求全部素数:
#include“math.h”
main()
{
intm,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()
{
intp,r,n,m,temp;
printf(“请输入两个整数n,m:
”);
scanf(“%d,%d”,&n,&m);
if(n{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()
{
intx,y,a,b,t;
scanf(“%d,%d”,&x,&y);
a=x;b=y;
while(a!
=b)
if(a>b)a=a-b;
elseb=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()
{longintf1,f2;
intI;
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()
{
intx;
printf(“Pleaseinputx(0<=x<=100)\n”);
scanf(“%d”,&x);
if(x>100||x<0)printf(“x=%ddataerror!
\n”,x);
else
if(x>=90)printf(“x=%d—A\n”,x);
elseif(x>=80)printf(“x=%d—B\n”,x);
elseif(x>=60)printf(“x=%d—C\n”,x);
elseprintf((“x=%d—D\n”,x);
}
b.switch语句
main()
{
floatx;
printf(“Pleaseinputx:
\n);
scanf(“%f”,&x);
switch((int)(x/10))
{
case10:
case9:
printf(“x=%f—A\n”,x);break;
case8:
printf(“x=%f—B\n”,x);break;
case7:
case6:
printf(“x=%f—C\n”,x);break;
case5:
case4:
case3:
case2:
case1:
case0:
printf(“x=%f—D\n”,x);break;
default:
printf(“x=%fdataerror!
\n”,x);
}
}
7、打印水仙花数
思路:
“水仙花数”是指一个3位数字的立方和等于该数本身。
例:
153=13+53+33
main()
{
intI,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=22*2=4
1*3=32*3=63*3=9
1*4=42*4=83*4=124*4=16
思路:
该题有列数、乘数的变化,而且其中一个乘数的变化跟另一个乘数有关。
main()
{
intI,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()
{
intI,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、Sn=a+aa+aaa+…+aa..a,其中a是一个数字。
例如2+22+222=?
main()
{inta,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()
{longintnum;
intindiv,ten,hundred,thousand,ten_thousand,place;
printf(“请输入一个整数:
”);
scanf(“%ld”,&num);
if(num>9999)place=5;
elseif(num>999)place=4;
elseif(num>99)place=3;
elseif(num>9)place=2;
elseplace=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*100)/10;
indiv=(int)(num-ten_thousand*10000-thousand*1000-hundred*100-ten*10);
switch(place)
{case5:
printf(“%d,%d,%d,%d,%d”,ten_thousand,thousand,hundred,ten,indiv);
printf(“\n反序数字为:
”);
printf(“%d%d%d%d%d%d\n”,indiv,ten,hundred,thousand,ten_thousand,);
break;
case4:
……
}
}
12、完数:
一个数如果恰好等于它的因子之和/
方法一:
main()
{
intm,s,I;
for(m=2;m<1000;m++)
{s=0;
for(I=1;Iif((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”);
}
}
}
方法二:
#defineM1000
main()
{intk1,k2,k3,k4,k5,k6,k7,k8,k9,k10;
intI,a,n,s;
for(a=2;a<=M;a++)
{n=0;s=a;
for(I=1;Iif(a%I==0)
{n++;s=s-I;
switch(n)
{case1:
k1=I;break;
case2:
k2=I;break;
…
case10:
k10=I;break;
}
}
if(s==0)
{printf(“%ditsfactorsare”,a);
if(n>1)printf(“%d,%d”,k1,k2);
if(n>2)printf(“,%d”,k3);
…
if(n>9)printf(“,%d”,k10);
printf(“\n”);
}
}
}
方法三:
运用数组