素數判斷
#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; }