在计算机的考试中,常常会遇到算法的题目,这让很多初学者伤透了脑筋,现在我在此总结常见的基本算法,希望能起到一些帮助。
1.数据分离:
将一个高位数的个十百千等位分离出来,算法很简单,也很基础。如513,百位为5,十位为1,个位为3,如何让电脑知晓这些信息呢?
处理方法:
-分离个位: n%10
-分离十位: n/10%10
-分离白位: n/100%10
....
循环处理常用语句
while(n)
{
a=n%10;
....
n=n/10; //结束循环,让n = 0
}
素数的判定:
求<=n的素数
因为2是最小的素数,故从2开始,依次一个一个地判断整数是否能被不是1和自己的数整除,因为当j>i/2或根号i
时,便不会再有i的因数,故到i/2或根号i就可以了。
for(i=2;i<=n;i++){
for(j=2;j<=i/2;j++) //i/2可改为sqrt(i)
if(i%j==0) break;
if(j>i/2) ……;
}
3.循环累加,累乘,累除等
常用算法
for(i=1;i<=n;i++)
循环体语句; /*可以是累加、累乘、累除的综合使用*/
循环体中常用:
-累加:s=s+i;
-累乘:s=s*i;
-累除:s=s/i;
4.排序
——冒泡排序:
sort()函数读入数组,然后按升序排序。
直接看例子:
void sort(int *a,int n){
int i,j,t;
for(i=0;i<n-1;i++)
for(j=0;j<n-1;j++)
if(a[j]>a[j+1]) //若前一个元素大于后一个元素
{
t=a[j]; a[j]=a[j+1]; a[j+1]=t; //那么交换前后元素
//于是大的数就都往后面排了,就像冒泡泡一样,注意冒泡排序有两个循环。
}}
——选择排序:
选择排序也有二重循环结构。
输入数组,按
void sort(int *a,int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<10;j++)
if(a[k]>a[j]) k=j; //查找数组中在a[i]后的最小数,k存放最小数的下标
t=a[i]; a[i]=a[k]; a[k]=t; //a[i]与最小数呼唤
}
}
5.牛顿迭代法:
牛顿迭代法又称牛顿切线法:先任意设定一个与真实的根接近的值x0作为第一次近似根,由x0求出f(x0),过(x0,f(x0))点做f(x)的切线,交x轴于x1,把它作为第二次近似根,再由x1求出f(x1),过(x1,f(x1))点做f(x)的切线,交x轴于x2,……如此继续下去,直到足够接近(比如|x- x0|<1e-6时)真正的根x*为止。
例如,用牛顿迭代法求下列方程在1.5附近的根:2x3-4x2+3x-6=0。
float x,x0,f,f1; x=1.5;
do{
x0=x;
f=2*x0*x0*x0-4*x0*x0+3*x0-6;
f1=6*x0*x0-8*x0+3;
x=x0-f/f1;
}
while(fabs(x-x0)>=1e-5);
printf ("%f\n",x);
6.二分法查找根
具体算法如下:
(1)输入x1和x2的值。
(2)求f(x1)和f(x2)。
(3)如果f(x1)和f(x2)同号说明在[x1, x2] 内无实根,返回步骤(1),重新输入x1和x2的值;若f(x1)和f(x2)不同号,则在区间[x1, x2]内必有一个实根,执行步骤(4)。
(4)求x1和x2的中点:x0=(x1+ x2)/2。
(5)求f(x0)。
(6)判断f(x0)与f(x1)是否同号。
①如果同号,则应在[x0, x2]中寻找根,此时x1已不起作用,用x0代替x1,用f(x0)代替f(x1)。
②如果不同号,则应在[x1, x0]中寻找根,此时x2已不起作用,用x0代替x2,用f(x0)代替f(x2)。
(7)判断f(x0)的绝对值是否小于某一指定的值(例如10-5)。若不小于10-5,则返回步骤(4)重复执行步骤(4)、(5)、(6);否则执行步骤(8)。
(8)输出x0的值,它就是所求出的近似根。
例如,用二分法求方程2x3-4x2+3x-6=0在(-10,10)之间的根。
#include "math.h"
main()
{
float x1,x2,x0,fx1,fx2,fx0;
do {
printf("Enter x1&x2");
scanf("%f%f",&x1,&x2);
fx1=2*x1*x1*x1-4*x1*x1+3*x1-6;
fx2=2*x2*x2*x2-4*x2*x2+3*x2-6;
}while(fx1*fx2>0);do {
x0=(x1+x2)/2;
fx0=2*x0*x0*x0-4*x0*x0+3*x0-6;
if((fx0*fx1)<0) {x2=x0; fx2=fx0; }
else {x1=x0; fx1=fx0;
}
}
while(fabs(fx0)>1e-5);
printf("%f\n",x0);}