10个重要的算法C语言实现源代码

1.拉格朗日插值多项式 ,用于离散数据的拟合
C/C++ code
   
   
#include < stdio.h >
#include
< conio.h >
#include
< alloc.h >
float lagrange( float * x, float * y, float xx, int n) /* 拉格朗日插值算法 */
{
int i,j;
float * a,yy = 0.0 ; /* a作为临时变量,记录拉格朗日插值多项式 */
a
= ( float * )malloc(n * sizeof ( float ));
for (i = 0 ;i <= n - 1 ;i ++ )
{ a[i]
= y[i];
for (j = 0 ;j <= n - 1 ;j ++ )
if (j != i) a[i] *= (xx - x[j]) / (x[i] - x[j]);
yy
+= a[i];
}
free(a);
return yy;
}
main()
{
int i,n;
float x[ 20 ],y[ 20 ],xx,yy;
printf(
" Input n: " );
scanf(
" %d " , & n);
if (n >= 20 ) {printf( " Error!The value of n must in (0,20). " ); getch(); return 1 ;}
if (n <= 0 ) {printf( " Error! The value of n must in (0,20). " ); getch(); return 1 ;}
for (i = 0 ;i <= n - 1 ;i ++ )
{ printf(
" x[%d]: " ,i);
scanf(
" %f " , & x[i]);
}
printf(
" /n " );
for (i = 0 ;i <= n - 1 ;i ++ )
{ printf(
" y[%d]: " ,i);scanf( " %f " , & y[i]);}
printf(
" /n " );
printf(
" Input xx: " );
scanf(
" %f " , & xx);
yy
= lagrange(x,y,xx,n);
printf(
" x=%f,y=%f/n " ,xx,yy);
getch();
}



2.牛顿插值多项式,用于离散数据的拟合
C/C++ code
   
   
#include < stdio.h >
#include
< conio.h >
#include
< alloc.h >
void difference( float * x, float * y, int n)
{
float * f;
int k,i;
f
= ( float * )malloc(n * sizeof ( float ));
for (k = 1 ;k <= n;k ++ )
{ f[
0 ] = y[k];
for (i = 0 ;i < k;i ++ )
f[i
+ 1 ] = (f[i] - y[i]) / (x[k] - x[i]);
y[k]
= f[k];
}
return ;
}
main()
{
int i,n;
float x[ 20 ],y[ 20 ],xx,yy;
printf(
" Input n: " );
scanf(
" %d " , & n);
if (n >= 20 ) {printf( " Error! The value of n must in (0,20). " ); getch(); return 1 ;}
if (n <= 0 ) {printf( " Error! The value of n must in (0,20). " );getch(); return 1 ;}
for (i = 0 ;i <= n - 1 ;i ++ )
{ printf(
" x[%d]: " ,i);
scanf(
" %f " , & x[i]);
}
printf(
" /n " );
for (i = 0 ;i <= n - 1 ;i ++ )
{ printf(
" y[%d]: " ,i);scanf( " %f " , & y[i]);}
printf(
" /n " );
difference(x,(
float * )y,n);
printf(
" Input xx: " );
scanf(
" %f " , & xx);
yy
= y[ 20 ];
for (i = n - 1 ;i >= 0 ;i -- ) yy = yy * (xx - x[i]) + y[i];
printf(
" NewtonInter(%f)=%f " ,xx,yy);
getch();
}



3.高斯列主元消去法,求解其次线性方程组
C/C++ code
   
   
#include < stdio.h >
#include
< math.h >
#define N 20
int main()
{
int n,i,j,k;
int mi,tmp,mx;
float a[N][N],b[N],x[N];
printf(
" /nInput n: " );
scanf(
" %d " , & n);
if (n > N)
{ printf(
" The input n should in(0,N)!/n " );
getch();
return 1 ;
}
if (n <= 0 )
{ printf(
" The input n should in(0,N)!/n " );
getch();
return 1 ;
}
printf(
" Now input a(i,j),i,j=0...%d:/n " ,n - 1 );
for (i = 0 ;i < n;i ++ )
{
for (j = 0 ;j < n;j ++ )
scanf(
" %f " , & a[i][j]);}
printf(
" Now input b(i),i,j=0...%d:/n " ,n - 1 );
for (i = 0 ;i < n;i ++ )
scanf(
" %f " , & b[i]);
for (i = 0 ;i < n - 2 ;i ++ )
{
for (j = i + 1 ,mi = i,mx = fabs(a[i][j]);j < n - 1 ;j ++ )
if (fabs(a[j][i]) > mx)
{ mi
= j;
mx
= fabs(a[j][i]);
}
if (i < mi)
{ tmp
= b[i];b[i] = b[mi];b[mi] = tmp;
for (j = i;j < n;j ++ )
{ tmp
= a[i][j];
a[i][j]
= a[mi][j];
a[mi][j]
= tmp;
}
}
for (j = i + 1 ;j < n;j ++ )
{ tmp
=- a[j][i] / a[i][i];
b[j]
+= b[i] * tmp;
for (k = i;k < n;k ++ )
a[j][k]
+= a[i][k] * tmp;
}
}
x[n
- 1 ] = b[n - 1 ] / a[n - 1 ][n - 1 ];
for (i = n - 2 ;i >= 0 ;i -- )
{ x[i]
= b[i];
for (j = i + 1 ;j < n;j ++ )
x[i]
-= a[i][j] * x[j];
x[i]
/= a[i][i];
}
for (i = 0 ;i < n;i ++ )
printf(
" Answer:/n x[%d]=%f/n " ,i,x[i]);
getch();
return 0 ;
}


#include
< math.h >
#include
< stdio.h >
#define NUMBER 20
#define Esc 0x1b
#define Enter 0x0d

float A[NUMBER][NUMBER + 1 ] ,ark;
int flag,n;
exchange(
int r, int k);
float max( int k);
message();

main()
{
float x[NUMBER];
int r,k,i,j;
char celect;
clrscr();

printf(
" /n/nUse Gauss. " );
printf(
" /n/n1.Jie please press Enter. " );
printf(
" /n/n2.Exit press Esc. " );
celect
= getch();
if (celect == Esc)
exit(
0 );
printf(
" /n/n input n= " );
scanf(
" %d " , & n);
printf(
" /n/nInput matrix A and B: " );
for (i = 1 ;i <= n;i ++ )
{
printf(
" /n/nInput a%d1--a%d%d and b%d: " ,i,i,n,i);

for (j = 1 ;j <= n + 1 ;j ++ ) scanf( " %f " , & A[i][j]);
}
for (k = 1 ;k <= n - 1 ;k ++ )
{
ark
= max(k);
if (ark == 0 )
{
printf(
" /n/nIt's wrong! " );message();
}
else if (flag != k)
exchange(flag,k);
for (i = k + 1 ;i <= n;i ++ )
for (j = k + 1 ;j <= n + 1 ;j ++ )
A[i][j]
= A[i][j] - A[k][j] * A[i][k] / A[k][k];
}
x[n]
= A[n][n + 1 ] / A[n][n];
for ( k = n - 1 ;k >= 1 ;k -- )
{
float me = 0 ;
for (j = k + 1 ;j <= n;j ++ )
{
me
= me + A[k][j] * x[j];
}
x[k]
= (A[k][n + 1 ] - me) / A[k][k];
}
for (i = 1 ;i <= n;i ++ )
{
printf(
" /n/nx%d=%f " ,i,x[i]);
}
message();
}

exchange(
int r, int k)
{
int i;
for (i = 1 ;i <= n + 1 ;i ++ )
A[
0 ][i] = A[r][i];
for (i = 1 ;i <= n + 1 ;i ++ )
A[r][i]
= A[k][i];
for (i = 1 ;i <= n + 1 ;i ++ )
A[k][i]
= A[ 0 ][i];
}

float max( int k)
{
int i;
float temp = 0 ;
for (i = k;i <= n;i ++ )
if (fabs(A[i][k]) > temp)
{
temp
= fabs(A[i][k]);
flag
= i;
}
return temp;
}

message()
{
printf(
" /n/n Go on Enter ,Exit press Esc! " );
switch (getch())
{
case Enter: main();
case Esc: exit( 0 );
default :{printf( " /n/nInput error! " );message();}
}
}



4.龙贝格求积公式,求解定积分
C/C++ code
   
   
#include < stdio.h >
#include
< math.h >
#define f(x) (sin(x)/x)
#define N 20
#define MAX 20
#define a 2
#define b 4
#define e 0.00001
float LBG( float p, float q, int n)
{
int i;
float sum = 0 ,h = (q - p) / n;
for (i = 1 ;i < n;i ++ )
sum
+= f(p + i * h);
sum
+= (f(p) + f(q)) / 2 ;
return (h * sum);
}
void main()
{
int i;
int n = N,m = 0 ;
float T[MAX + 1 ][ 2 ];
T[
0 ][ 1 ] = LBG(a,b,n);
n
*= 2 ;
for (m = 1 ;m < MAX;m ++ )
{
for (i = 0 ;i < m;i ++ )
T[i][
0 ] = T[i][ 1 ];
T[
0 ][ 1 ] = LBG(a,b,n);
n
*= 2 ;
for (i = 1 ;i <= m;i ++ )
T[i][
1 ] = T[i - 1 ][ 1 ] + (T[i - 1 ][ 1 ] - T[i - 1 ][ 0 ]) / (pow( 2 , 2 * m) - 1 );
if ((T[m - 1 ][ 1 ] < T[m][ 1 ] + e) && (T[m - 1 ][ 1 ] > T[m][ 1 ] - e))
{ printf(
" Answer=%f/n " ,T[m][ 1 ]); getch();
return ;
}
}
}



5.牛顿迭代公式,求方程的近似解
C/C++ code
   
   
#include < stdio.h >
#include
< math.h >
#include
< conio.h >
#define N 100
#define PS 1e-5
#define TA 1e-5
float Newton( float ( * f)( float ), float ( * f1)( float ), float x0 )
{
float x1,d = 0 ;
int k = 0 ;
do
{ x1
= x0 - f(x0) / f1(x0);
if ((k ++> N) || (fabs(f1(x1)) < PS))
{ printf(
" /nFailed! " );
getch();
exit();
}
d
= (fabs(x1) < 1 ? x1 - x0:(x1 - x0) / x1);
x0
= x1;
printf(
" x(%d)=%f/n " ,k,x0);
}
while ((fabs(d)) > PS && fabs(f(x1)) > TA) ;
return x1;
}
float f( float x)
{
return x * x * x + x * x - 3 * x - 3 ; }
float f1( float x)
{
return 3.0 * x * x + 2 * x - 3 ; }
void main()
{
float f( float );
float f1( float );
float x0,y0;
printf(
" Input x0: " );
scanf(
" %f " , & x0);
printf(
" x(0)=%f/n " ,x0);
y0
= Newton(f,f1,x0);
printf(
" /nThe root is x=%f/n " ,y0);
getch();
}

6. 牛顿-科特斯求积公式,求定积分
C/C++ code
   
   
#include < stdio.h >
#include
< math.h >
int NC(a,h,n,r,f)
float ( * a)[];
float h;
int n,f;
float * r;
{
int nn,i;
float ds;
if (n > 1000 || n < 2 )
{
if (f)
printf(
" /n Faild! Check if 1<n<1000!/n " ,n);
return ( - 1 );
}
if (n == 2 )
{
* r = 0.5 * (( * a)[ 0 ] + ( * a)[ 1 ]) * (h);
return ( 0 );
}
if (n - 4 == 0 )
{
* r = 0 ;
* r =* r + 0.375 * (h) * (( * a)[n - 4 ] + 3 * ( * a)[n - 3 ] + 3 * ( * a)[n - 2 ] + ( * a)[n - 1 ]);
return ( 0 );
}
if (n / 2 - (n - 1 ) / 2 <= 0 )
nn
= n;
else
nn
= n - 3 ;
ds
= ( * a)[ 0 ] - ( * a)[nn - 1 ];
for (i = 2 ;i <= nn;i = i + 2 )
ds
= ds + 4 * ( * a)[i - 1 ] + 2 * ( * a)[i];
* r = ds * (h) / 3 ;
if (n > nn)
* r =* r + 0.375 * (h) * (( * a)[n - 4 ] + 3 * ( * a)[n - 3 ] + 3 * ( * a)[n - 2 ] + ( * a)[n - 1 ]);
return ( 0 );
}
main()
{
float h,r;
int n,ntf,f;
int i;
float a[ 16 ];
printf(
" Input the x[i](16):/n " );
for (i = 0 ;i <= 15 ;i ++ )
scanf(
" %d " , & a[i]);
h
= 0.2 ;
f
= 0 ;
ntf
= NC(a,h,n, & r,f);
if (ntf == 0 )
printf(
" /nR=%f/n " ,r);
else
printf(
" /n Wrong!Return code=%d/n " ,ntf);
getch();
}



7.雅克比迭代,求解方程近似解
C/C++ code
   
   
#include < stdio.h >
#include
< math.h >
#define N 20
#define MAX 100
#define e 0.00001
int main()
{
int n;
int i,j,k;
float t;
float a[N][N],b[N][N],c[N],g[N],x[N],h[N];
printf(
" /nInput dim of n: " ); scanf( " %d " , & n);
if (n > N)
{ printf(
" Faild! Check if 0<n<N!/n " ); getch(); return 1 ; }
if (n <= 0 )
{printf(
" Faild! Check if 0<n<N!/n " ); getch(); return 1 ;}
printf(
" Input a[i,j],i,j=0…%d:/n " ,n - 1 );
for (i = 0 ;i < n;i ++ )
for (j = 0 ;j < n;j ++ )
scanf(
" %f " , & a[i][j]);
printf(
" Input c[i],i=0…%d:/n " ,n - 1 );
for (i = 0 ;i < n;i ++ )
scanf(
" %f " , & c[i]);
for (i = 0 ;i < n;i ++ )
for (j = 0 ;j < n;j ++ )
{ b[i][j]
=- a[i][j] / a[i][i]; g[i] = c[i] / a[i][i]; }
for (i = 0 ;i < MAX;i ++ )
{
for (j = 0 ;j < n;j ++ )
h[j]
= g[j];
{
for (k = 0 ;k < n;k ++ )
{
if (j == k) continue ; h[j] += b[j][k] * x[k]; }
}
t
= 0 ;
for (j = 0 ;j < n;j ++ )
if (t < fabs(h[j] - x[j])) t = fabs(h[j] - x[j]);
for (j = 0 ;j < n;j ++ )
x[j]
= h[j];
if (t < e)
{ printf(
" x_i=/n " );
for (i = 0 ;i < n;i ++ )
printf(
" x[%d]=%f/n " ,i,x[i]);
getch();
return 0 ;
}
printf(
" after %d repeat , return/n " ,MAX);
getch();
return 1 ;
}
getch();
}



8.秦九昭算法
C/C++ code
   
   
#include < math.h >
float qin( float a[], int n, float x)
{
float r = 0 ;
int i;
for (i = n;i >= 0 ;i -- )
r
= r * x + a[i];
return r;
}
main()
{
float a[ 50 ],x,r = 0 ;
int n,i;
do
{ printf(
" Input frequency: " );
scanf(
" %d " , & n);
}
while (n < 1 );
printf(
" Input value: " );
for (i = 0 ;i <= n;i ++ )
scanf(
" %f " , & a[i]);
printf(
" Input frequency: " );
scanf(
" %f " , & x);
r
= qin(a,n,x);
printf(
" Answer:%f " ,r);
getch();
}



9.幂法
C/C++ code
   
   
#include < stdio.h >
#include
< math.h >
#define N 100
#define e 0.00001
#define n 3
float x[n] = { 0 , 0 , 1 };
float a[n][n] = {{ 2 , 3 , 2 },{ 10 , 3 , 4 },{ 3 , 6 , 1 }};
float y[n];
main()
{
int i,j,k;
float xm,oxm;
oxm
= 0 ;
for (k = 0 ;k < N;k ++ )
{
for (j = 0 ;j < n;j ++ )
{ y[j]
= 0 ;
for (i = 0 ;i < n;i ++ )
y[j]
+= a[j][i] * x[i];
}
xm
= 0 ;
for (j = 0 ;j < n;j ++ )
if (fabs(y[j]) > xm) xm = fabs(y[j]);
for (j = 0 ;j < n;j ++ )
y[j]
/= xm;
for (j = 0 ;j < n;j ++ )
x[j]
= y[j];
if (fabs(xm - oxm) < e)
{ printf(
" max:%f/n/n " ,xm);
printf(
" v[i]:/n " );
for (k = 0 ;k < n;k ++ ) printf( " %f/n " ,y[k]);
break ;
}
oxm
= xm;
}
getch();
}



10.高斯塞德尔
C/C++ code
   
   
#include < math.h >
#include
< stdio.h >
#define N 20
#define M 99
float a[N][N];
float b[N];
int main()
{
int i,j,k,n;
float sum,no,d,s,x[N];
printf(
" /nInput dim of n: " );
scanf(
" %d " , & n);
if (n > N)
{ printf(
" Faild! Check if 0<n<N!/n " ); getch();
return 1 ;
}
if (n <= 0 )
{ printf(
" Faild! Check if 0<n<N!/n " );getch(); return 1 ;}
printf(
" Input a[i,j],i,j=0…%d:/n " ,n - 1 );
for (i = 0 ;i < n;i ++ )
for (j = 0 ;j < n;j ++ )
scanf(
" %f " , & a[i][j]);
printf(
" Input b[i],i=0…%d:/n " ,n - 1 );
for (i = 0 ;i < n;i ++ ) scanf( " %f " , & b[i]);
for (i = 0 ;i < n;i ++ ) x[i] = 0 ;
k
= 0 ;
printf(
" /nk=%dx= " ,k);
for (i = 0 ;i < n;i ++ ) printf( " %12.8f " ,x[i]);
do
{ k
++ ;
if (k > M){printf( " /nError!/n”);getch();}
break ;
}
no
= 0.0 ;
for (i = 0 ;i < n;i ++ )
{ s
= x[i];
sum
= 0.0 ;
for (j = 0 ;j < n;j ++ )
if (j != i) sum = sum + a[i][j] * x[j];
x[i]
= (b[i] - sum) / a[i][i];
d
= fabs(x[i] - s);
if (no < d) no = d;
}
printf(
" /nk=%2dx= " ,k);
for (i = 0 ;i < n;i ++ ) printf( " %f " ,x[i]);
}
while (no >= 0.1e-6 );
if (no < 0.1e-6 )
{ printf(
" /n/n answer=/n " );
printf(
" /nk=%d " ,k);
for (i = 0 ;i < n;i ++ )
printf(
" /n x[%d]=%12.8f " ,i,x[i]);
}
getch();
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值