c语言算法作用,非常全的C语言常用算法

《非常全的C语言常用算法》由会员分享,可在线阅读,更多相关《非常全的C语言常用算法(39页珍藏版)》请在人人文库网上搜索。

1、精品、基本算法1交换(两量交换借助第三者)例 1 、任意读入两个整数,将二者的值交换后输出。main()int a,b,t;scanf(%d%d,&a,&b);printf(%d,%dn,a,b);t=a; a=b; b=t;printf(%d,%dn,a,b);【解析】程序中 加粗 部分为算法的核心,如同交换两个杯子里的饮料,必须借助第三个空杯子。 假设输入的值分别为 3、 7 ,则第一行输出为 3, 7 ;第二行输出为 7,3。其中 t 为中间变量,起到“空杯子”的作用。注意 :三句赋值语句赋值号左右的各量之间的关系!【应用】例 2 、任意读入三个整数,然后按从小到大的顺序输出。main(。

2、)int a,b,c,t;scanf(%d%d%d,&a,&b,&c);/* 以下两个 if 语句使得 a 中存放的数最小 */if(ab) t=a; a=b; b=t; if(ac) t=a; a=c; c=t; /* 以下 if 语句使得 b 中存放的数次小 */if(bc) t=b; b=c; c=t; printf(%d,%d,%dn,a,b,c);2累加累加算法的要领是形如“ S=S+A”的累加式,此式必须出现在循环中才能被反复执行,从而实现累加功能。“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为0。例1、求1+2+3+100的和。main()int i,S。

3、;S=0;i=1;while(iai+1)t=ai;ai=ai+1;ai+1=t;for(i=0;ian-2) an-1=x ; /* 比最后一个数还大就往最后一个元素中存放 */else/* 查找待插位置 */感谢下载载j=0;while( jaj) j+;/* 从最后一个数开始直到待插位置上的数依次后移一位*/for(k=n-2; k=j; k- -)ak+1=ak;aj=x; /* 插入待插数*/ for(j=0;j=i;k-) ak+1=ak;ai=x; /* 插入待插数 */for(i=0;i=m & j=n & ifloat g(float x,float eps);mai n()。

4、float x,eps;sea nf(%f%f, &x,& eps);prin tf(n%f,%fn ”,x,g(x,eps);float g(float x,float eps)int n=1;float s,t;s=1;t=1;do t=t*x/(2* n);s=s+ (n*n +1) *t;/*加波浪线的部分为直接法描述部分,t为递推法描述部分*/n+; while(fabs(t)eps);return s;2.一元非线性方程求根(1)牛顿迭代法牛顿迭代法又称牛顿切线法:先任意设定一个与真实的根接近的值X0作为第一次近似根,由X0求出f(x 0),过(X0, f(x 0)点做f(x)的切。

5、线,交x轴于X1,把它作为第二次近似根,再由X1求出f(X1),过(x1, f(x1)点做f(x)的切线,交x轴于X2, 如此继续下去,直到足够接近(比如 |x- x 0|=1e-5);printf (%fn,x); (2)二分法算法要领是:先指定一个区间X1, X2,如果函数f(x)在此区间是单调变化的,则可以根据f(X1)和f(X2)是否同号来确定方程f(x)=0在区间X1, X2内是否有一个实根;如果 f(X1)和f(x 2)同号,则f(x)在区间X1 , X2内无实根,要重新改变X1和X2的值。当确定f(x)在区间X1, X2内有一个实根后,可采取二分法将X1, X2 一分为二,再判断。

6、在哪一个小区间中有实根。如此不断进行下去,直 到小区间足够小为止。具体算法如下:(1 )输入X1和X2的值。(2 )求 f(x 1)和 f(X2)。(3 )如果f(X 1)和 f(X2)同号说明在X1, X2内无实根,返回步骤(1 ),重新输入X1和X2的值;若f(X1 )和f(X 2)不同号,则在区间X1, X2内必有一个实根,执行步骤(4 )。(4)求 X1 和 X2 的中点: X0=( X1+ X2) /2 。( 5)求 f(X0)。(6 )判断f(xo)与f(X1)是否同号。 如果同号,则应在X0, X2中寻找根,此时X1已不起作用,用X0代替X1,用f(X0)代替f(X 1)。 如果。

7、不同号,则应在X1 , X0中寻找根,此时X2已不起作用,用X0代替X2,用f(X0)代替f(X 2)。(7 )判断f(X 0)的绝对值是否小于某一指定的值(例如 10-5)。若不小于10-5,则返回步骤(4)重复执行步骤( 4)、(5)、(6);否则执行步骤( 8)。(8 )输出X0的值,它就是所求出的近似根。例如,用二分法求方程2X3-4X 2+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*。

8、X1*X1-4*X1*X1+3*X1-6;fX2=2*X2*X2*X2-4*X2*X2+3*X2-6;while(fX1*fX20);do x0=(x1+x2)/2;fx0=2*x0*x0*x0-4*x0*x0+3*x0-6;if(fx0*fx1)1e-5);prin tf(%fn,xO);3 梯形法计算定积分b定积分f(x)dx的几何意义是求曲线y=f(x)、x=a、x=b以及x轴所围成的面积。a可以近似地把面积视为若干小的梯形面积之和。例如,把区间a, b分成n个长度相等的小区间,每个小区间的长度为h=(b-a)/n ,第i个小梯形的面积为f(a+(i-1) h)+f(a+i h) h/2。

9、,将n个小梯形面积加起来就得到定积分的近似值:f ( x)dxf (ai 1(i 1) ? h)f (a i ? h ) ? h / 2根据以上分析,给出“梯形法”求定积分的N-S结构图:输入区间端点:a, b输入等分数nh=(b-a)/2,s=0i从1到nsi=(f(a+(i-1)*h)+f(a+i*h)*h/2s=s+si输出s上述程序的几何意义比较明显,容易理解。但是其中存在重复计算,每次循环都要计算小梯形的上、下底。其实,前一个小梯形的下底就是后一个小梯形的上底,完全不必重复计算。为此做出如下改进:bn 1i ? h )4例如:求定积分0 (x* X 3* x 2) dx的值。等分数n。

10、=1000。#in elude math.h float DJF(float a,float b)float t,h;intn ,i;float HSZ(float x);n=1000;h=fabs(a-b)/n;t=(HSZ(a)+HSZ(b)/2;for(i=1;i=1;day-)peach=(peach+1)*2;printf(The first day:%dn,peach);又如,用迭代法求x= 、a的根。求平方根的迭代公式是:Xn+1 =0.5 X(Xn+a/ X n )算法(1 )设定一个初值X0。(2 )用上述公式求出下一个值X1。(3 )再将X1代入上述公式,求出下一个值 X2。

11、。和Xn )满足以下关系:(4 )如此继续下去,直到前后两次求出的X值(Xn+1| X n+1 - X n|=1e-5);prin tf(%fn,x1);2 .进制转换(1)十进制数转换为其他进制数0 时止,一个十进制正整数 m 转换成 r 进制数的思路是,将 m 不断除以 r 取余数,直到商为 以反序输出余数序列即得到结果。注意,转换得到的不是数值,而是数字字符串或数字串。 例如,任意读入一个十进制正整数,将其转换成二至十六任意进制的字符串。void tran(int m,int r,char str,int *n)char sb=0123456789ABCDEF; int i=0,g;do。

12、g=m%r;stri=sbg;m=m/r;i+;while(m!=0);*n=i;main()int x,r0;/*r0 为进制基数 */int i,n;/*n 中存放生成序列的元素个数 */char a50;scanf(%d%d,&x,&r0); if(x0&r0=2&r0=0;i-) printf(%c,ai);printf(n); else exit(0);( 2 )其他进制数转换为十进制数其他进制整数转换为十进制整数的 要领 是:“按权展开” ,例如,有二进制数 101011 ,则其十进制形式为 1 X25+0 X24+1 X23+0 X22+1 X21+1 X2=43。若 r 进制数。

13、 an a2ai (n 位数)转 换成十进制数,方法是an xr n-1 +a2 xr1+a i xr0o注意 :其他进制数只能以字符串形式输入。例 1 、任意读入一个二至十六进制数(字符串) ,转换成十进制数后输出。#include string.h#include ctype.hmain()char x20; int r,d;gets(x);/* 输入一个 r 进制整数序列 */scanf(%d,&r);/* 输入待处理的进制基数 2-16*/d=Tran(x,r);printf(%s=%dn,x,d);int Tran(char *p,int r)int d,i,cr; char fh,。

14、c;d=0; fh=*p;if(fh=-)p+;for(i=0;i=A) cr=toupper(c)-A+10else cr=c-0;d=d*r+cr;if(fh=-) d=-d;return(d);3矩阵转置列矩阵(即 m xn矩阵)的每一行转置成另一个456nx矩阵转置的 算法要领 是:将一个 m 行 n即将123转置成14 5623main()int a23,b32,i,j,k=1;例1、将以下2 X3矩阵转置后输出。m 矩阵的相应列。for(i=0;i=x&ai=X&ai=0;j-)printf(%d ,aj);printf(n);6辗转相除法求两个正整数的最大公约数该算法的要领 是:。

15、假设两个正整数为 a 和 b ,先求出前者除以后者的余数,存放到变量 r 中,若r不为0,则将b的值得赋给a,将r的值得赋给b;再求出a除以b的余数,仍然存放到变量r中如此反复,直至r为0时终止,此时b中存放的即为原来两数的最大公约数。例 1、任意读入两个正整数,求出它们的最大公约数。 法一:用 while 循环时,最大公约数存放于 b 中 main()int a,b,r;do scanf(%d%d,&a,&b);while(amax) max=ai;else if(ai#include main( )int k,j,a101;clrscr(); /* 清屏函数 */for(k=2;k=0;j-)printf(for(j=0;j=i;j+)printf(%4d,ai j);printf(n);111 2 13 3 14 6 4 1感谢下载!欢迎您的下载,资料仅供参考。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值