初学者必知的12个基本算法(上)

在计算机的考试中,常常会遇到算法的题目,这让很多初学者伤透了脑筋,现在我在此总结常见的基本算法,希望能起到一些帮助。

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);}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘螺舟而至

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值