C語言常用數值計算算法(素數、公約數、級數、方程根和定積分)


素數判斷

#include<stdio.h>
#include<math.h>
int main()
{
    int n,min,max,isprime;
    scanf("%d %d",&min,&max);
    if(min<=2){
        printf("%4d",2);
        min=3;
    }
    if(min%2==0)
        min++;
    for(n=min;n<=max;n+=2){
        for(isprime=1,i=2;t&&i<=sqrt(n);i++)
            if(n%i==0)
                isprime=0;
        if(isprime)
            printf("%4d",n);
    }
    return 0;
}

最大公約數

1.brute-force算法

#include<stdio.h>
int main()
{
    int x=30,y=45,z;
    z=x;
    while(!(x%z==0&&y%z==0))
        z--;
    printf("%d",z);
    return 0;
}

2.歐幾里得算法

#include<stdio.h>
int main()
{
    int x=35,y=45,r;
    while((r=x%y)!=0){
        x=y;
        y=r;
    }
    printf("%d",y);
    return 0;
}

窮舉法

解方程: ①x+y+z=100 ②5x+3y+z/3=100

#include<stdio.h>
int main()
{
    int x,y,z;
    for(x=0;x<=20;x++)
        for(y=0;y<=33;y++)
            for(z=0;z<=100;z++)
                if(x+y+z==100&&5*x+3*y+z/3==100&&z%3==0)
                    printf("x=%d,y=%d,z=%d\n");
    return 0;
}

 

#include<stdio.h>
int main()
{
    int x,y,z;
    for(x=0;x<=20;x++)
        for(y=0;y<=33;y++){
            z=100-x-y;
            if(5*x+3*y+z/3==100&&z%3==0)
                printf("x=%d,y=%d,z=%d\n",x,y,z);
        }
    return 0;
}

級數近似

#include<stdio.h>
#include<math.h>
int main()
{
    double s=1,a=1,x,eps;
    int n;
    scanf("%lf%lf",&x,&eps);
    for(n=2;fabs(a)>eps;n++){
        a=a*x/(n-1);
        s+=a;
    }
    printf("%f",s);
    return 0;
)

 

#include<stdio.h>
#include<math.h>
int main()
{
    
    double sum,x,eps=1e-6,fn,tn;
    int s=1,n=2;
    scanf("%lf",&x);
    s=fn=x;
    do{
    s=-s;
    fn=fn*(2*n-3)/(2*n-2)*x*x;
    tn=sign*fn/(2*n-1);
    sum=sum+tn;
    n++;
    }while(fabs(tn)>eps);
    printf("%f",sum);

 

一元非線性方程求根

一、牛頓迭代法

  1.基本概念:如果函數連續,且待求零點孤立,那么在零點周圍存在一個區域,當初值在這個鄰域內時,牛頓法收斂。如果零點不為0, 那么牛頓法將具有平方收斂的性能。

  2.基本公式:xk+1=xk-f(xk)/f'(xk)

  3.判斷條件:|f(xn+1)|<ε或|xn+1-xn|<ε是否為真。若為真則xn+1就是方程f(x)=0在x0附近誤差ε范圍內的一個近似根。

  4.實際應用:求cos(x)-x=0的近似解,精確到10-6

#include<stdio.h>
#include<math.h>

int main()
{
    double x1=0, x2 = 2;
    while (fabs(cos(x2)-x2)>1e-6&&fabs(x2-x1)>1e-6){
        x1 = x2;
        x2 = x1 + (cos(x1) - x1) / (sin(x1) + 1);
    }
    printf("x=%f\nf(x)=%.6f",x2,fabs(cos(x2)-x2));
    return 0;
}

二、二分法

  1.基本概念:對於區間[a,b]上連續不斷且 f(a)f(b)<0的函數y=f(x) ,通過不斷地把函數 f(x) 的零點所在的區間一分為二,使區間的兩個端點逐步逼近零點,進而得到零點近似值的方法叫二分法。

  2.實際應用:求exp(x)+x=0在(-1, 0)的根,精確到10-6

#include<stdio.h>
#include<math.h>
double f(double x);

int main()
{
    double a=-1, b=0, c;
    c = (a+b)/2;
    do{

        if(f(a)*f(c)>0)
            a = c;
        else
            b = c;
        c = (a+b)/2;
    } while (fabs(f(c)) > 1e-6&&fabs(a-b)>1e-6);
    printf("x=%.6f", c);
    return 0;
}

double f(double x)
{
    return exp(x) + x;
}

三、弦截法

  1.基本概念:弦截法是求非線性方程近似根的一種線性近似方法。它是以與曲線弧AB對應的弦AB與x軸的交點橫坐標作為曲線弧AB與x軸的交點橫坐標的近似值μ來求出方程的近似解。

  2.實際應用:求((x+2)*x-2)*x-1=0在(-1, 0)的根,精確到10-6

#include <math.h>
#include <stdio.h>
float f(float x)
{
    float y;
    y = ((x + 2.0) * x - 2.0) * x - 1.0;
    return y;
}

int main()
{
    float x, x1, x2;
    x1 = -1, x2 = 0;
    do{
        x = (x1 * f(x2) - x2 * f(x1)) / (f(x2) - f(x1));
        if (f(x) * f(x1) > 0)
            x1 = x;
        else
            x2 = x;
    } while (fabs(f(x)) >= 1e-6);
    printf("the root is %f\n", x);
    printf("((x+2.0)*x-2.0)*x-1.0=%f\n", f(x));
    return 0;
}

定積分近似計算

1.梯形法

  算法思想

 

  程序實現

 

#include<stdio.h>
#include<math.h>
int main()
{
    long n, i;
    double a=-1.57,b=1.57,h,s,x;
    scanf("%ld",&n);
    h=(b-a)/n;
    s=(cos(a)+cos(b))/2;
    x=a;
    for(i=1;i<n;i++){
        x+=h;
        s+=cos(x);
    }
    printf("%f",s*h);
    return 0;
}

 

2.矩形法

  算法思想

  程序實現

#include<stdio.h>
#include<math.h>
int main()
{
    long n,i;
    double a=-1.57,b=1.57,h,s=0,x;
    scanf("%ld",&n);
    h=(b-a)/n;
    x=a;
    for(i=0;i<n;i++){
        s+=cos(x);
        x+=h;
    }
    printf("%f",s*h);
    return 0;
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM