C语言常用代码_第1页
C语言常用代码_第2页
C语言常用代码_第3页
C语言常用代码_第4页
免费预览已结束,剩余24页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include<iostream>using namespace std;void fullxunhuan(int *a,int n)void main()int t=0;int *a;int m1,m2;int n;if(n%2!=0)cout<<" 请输入N"<<endl;n+;cin>>n;for(int i=0;i<n%2;i+)a=new int *n;/申请一个N 行N列的数组for(m1=i,m2=n-i-1;m1<=n-i-1;m1+)for(int i1=0;i1<n;i1+)ai1=ne

2、w intn;am1m2=t%n+1;t+;for(int i=0;i<n;i+)/给数组初始化for(-m1,-m2;m2>i;m2-)for(int j=0;j<n;j+)am1m2=t%n+1;aij=0;t+;for(;m1>i;m1-)fullxunhuan(a,n);print(a,n);am1m2=t%n+1;t+;for(;m2<n-i-1;m2+)am1m2=t%n+1;t+;void print(int *a,int n)for(int i=0;i<n;i+)for(int j=0;j<n;j+)cout<<aij<

3、;<"t"cout<<"n"精选文库ACM 小组内部预定函数图论:数学问题:1.Prim 算法求最小生成树1.精度计算大数阶乘2.Dijkstra 算法求单源最短路径2.精度计算乘法(大数乘小数)3.Bellman-ford 算法求单源最短路径3.精度计算乘法(大数乘大数)4.Floyd 算法求每对节点间最短路径4.精度计算加法5.精度计算减法排序 / 查找:6.任意进制转换1.快速排序7.最大公约数、最小公倍数2.希尔排序8.组合序列3.选择法排序9.快速傅立叶变换(FFT)4.二分查找10.Ronberg 算法计算积分11.行列式计

4、算数据结构:12.求排列组合数1.顺序队列2.顺序栈字符串处理:3.链表1.字符串替换4.链栈2.字符串查找5.二叉树3.字符串截取计算几何:1.叉乘法求任意多边形面积一、数学问题2.求三角形面积1.精度计算大数阶乘3.两矢量间角度语法: int result=factorial(int n);4.两点距离( 2D 、 3D )参数:5.射向法判断点是否在多边形内部n: n 的阶乘6.判断点是否在线段上返回值:阶乘结果的位数7.判断两线段是否相交注意:8.判断线段与直线是否相交本程序直接输出n!的结果, 需要返回结9.点到线段最短距离果请保留 long a10.求两直线的交点需要 math.h

5、11.判断一个封闭图形是凹集还是凸集源程序:12.Graham 扫描法寻找凸包int factorial(int n)数论:long a10000;1.x 的二进制长度int i,j,l,c,m=0,w;2.返回 x 的二进制表示中从低到高的第i 位a0=1;3.模取幂运算for(i=1;i<=n;i+)4.求解模线性方程5.求解模线性方程组 (中国余数定理 )c=0;6.筛法素数产生器for(j=0;j<=m;j+)7.判断一个数是否素数aj=aj*i+c;2c=aj/10000;aj=aj%10000;if(c>0) m+;am=c;w=m*4+log10(am)+1;

6、printf("n%ld",am); for(i=m-1;i>=0;i-) printf("%4.4ld",ai); return w;2.精度计算乘法(大数乘小数)语法: mult(char c,char t,int m); 参数:c:被乘数,用字符串表示,位数不限t: 结果,用字符串表示m: 乘数,限定10 以内返回值:null注意:需要string.h源程序:void mult(char c,char t,int m)int i,l,k,flag,add=0;char s100;l=strlen(c);for (i=0;i<l;i+)s

7、l-i-1=ci-'0'for (i=0;i<l;i+)k=si*m+add;if(k>=10)si=k%10;add=k/10;flag=1; else si=k;flag=0;add=0;if (flag) l=i+1;si=add; else l=i;for (i=0;i<l;i+)tl-1-i=si+'0'tl='0'3.精度计算乘法(大数乘大数)精选文库语法: mult(char a,char b,char s); 参数:a:被乘数,用字符串表示,位数不限b:乘数,用字符串表示,位数不限t: 结果,用字符串表示返回值:

8、null注意:空间复杂度为o(n2)需要string.h源程序:void mult(char a,char b,char s)inti,j,k=0,alen,blen,sum=0,res6565=0,flag=0;char result65;alen=strlen(a);blen=strlen(b);for (i=0;i<alen;i+)for(j=0;j<blen;j+)resij=(ai-'0')*(bj-'0');for (i=alen-1;i>=0;i-)for(j=blen-1;j>=0;j-)sum=sum+resi+blen

9、-j-1j;resultk=sum%10;k=k+1;sum=sum/10;for (i=blen-2;i>=0;i-)for(j=0;j<=i;j+)sum=sum+resi-jj;resultk=sum%10;k=k+1;sum=sum/10;if (sum!=0) resultk=sum;k=k+1; for (i=0;i<k;i+) resulti+='0'for (i=k-1;i>=0;i-) si=resultk-1-i;sk='0'while(1)if (strlen(s)!=strlen(a)&&s0=&#

10、39;0')strcpy(s,s+1);3elsebreak;4.精度计算加法语法: add(char a,char b,char s); 参数:a: 被乘数,用字符串表示,位数不限b:乘数,用字符串表示,位数不限t: 结果,用字符串表示返回值:null注意:空间复杂度为o(n2)需要string.h源程序:void add(char a,char b,char back)int i,j,k,up,x,y,z,l;char *c;if (strlen(a)>strlen(b) l=strlen(a)+2; else l=strlen(b)+2;c=(char *) malloc(

11、l*sizeof(char);i=strlen(a)-1;j=strlen(b)-1;k=0;up=0;while(i>=0|j>=0)if(i<0) x='0' else x=ai;if(j<0) y='0' else y=bj;z=x-'0'+y-'0'if(up) z+=1;if(z>9)up=1;z%=10;elseup=0;ck+=z+'0'i-;j-;if(up) ck+='1'i=0;ck='0'for(k-=1;k>=0;k-)ba

12、cki+=ck;backi='0'精选文库5.精度计算减法语法: sub(char s1,char s2,char t); 参数:s1:被减数, 用字符串表示,位数不限s2:减数,用字符串表示,位数不限t: 结果,用字符串表示返回值:null注意:默认 s1>=s2,程序未处理负数情况需要 string.h源程序:void sub(char s1,char s2,char t)int i,l2,l1,k;l2=strlen(s2);l1=strlen(s1);tl1='0'l1-;for (i=l2-1;i>=0;i-,l1-)if (s1l1-s2

13、i>=0)tl1=s1l1-s2i+'0'elsetl1=10+s1l1-s2i+'0's1l1-1=s1l1-1-1;k=l1;while(s1k<0)s1k+=10;s1k-1-=1;k-;while(l1>=0) tl1=s1l1;l1-;loop:if (t0='0')l1=strlen(s1);for (i=0;i<l1-1;i+) ti=ti+1;tl1-1='0'goto loop;if (strlen(t)=0) t0='0't1='0'4精选文库6.任意进制

14、转换参数:语 法 : conversion(chars1,chars2,longa: int a,求最大公约数或最小公倍数d1,long d2);b: int b ,求最大公约数或最小公倍数参数:返回值:返回最大公约数 ( hcf)或最小s: 原进制数字,用字符串表示公倍数( lcd)s2:转换结果,用字符串表示注意:d1:原进制数lcd需要连同 hcf 使用d2:需要转换到的进制数源程序:返回值:nullint hcf(int a,int b)注意:高于9 的位数用大写 'A' 'Z' 表示, 2int r=0;16 位进制通过验证while(b!=0)源程序

15、:voidconversion(chars,chars2,longr=a%b;d1,long d2)a=b;b=r;long i,j,t,num;char c;return(a);num=0;for (i=0;si!='0'i+)lcd(int u,int v,int h)if(si<='9'&&si>='0')t=si-'0'return(u*v/h);else t=si-'A'+10;num=num*d1+t;8.组合序列i=0;语法: m_of_n(int m, int n1, i

16、nt m1, int* a, intwhile(1)head)参数:t=num%d2;m: 组合数 C 的上参数if(t<=9)s2i=t+'0'elsen1:组合数 C 的下参数s2i=t+'A'-10;m1:组合数 C 的上参数,递归之用num/=d2;*a: 1 n 的整数序列数组if (num=0) break;head:头指针i+;返回值:null注意:for (j=0;j<i/2;j+)*a 需要自行产生c=s2j;s2j=si-j;s2i-j=c;初始调用时, m=m1 、 head=0s2i+1='0'调 用 例 子

17、: 求 C(m,n) 序 列 :m_of_n(m,n,m,a,0);源程序:7.最大公约数、最小公倍数void m_of_n(int m, int n1, int m1, int* a,语法: resulet=hcf(inta,intb) 、 result=lcd(intint head)a,int b)5精选文库int i,t;if(m1<0 | m1>n1) return;m=it; is=0;if(m1=n1)for (i=0; i<=k-1; i+)j=m/2; is=2*is+(m-2*j); m=j;for(i=0;i<m;i+) cout<<a

18、i<<' ' /frit=pris; fiit=piis;输出序列cout<<'n'pr0=1.0; pi0=0.0;return;p=6.283185306/(1.0*n);pr1=cos(p); pi1=-sin(p);m_of_n(m,n1-1,m1,a,head); /递归调用if (l!=0) pi1=-pi1;for (i=2; i<=n-1; i+)t=ahead;ahead=an1-1+head;an1-1+head=t;p=pri-1*pr1;m_of_n(m,n1-1,m1-1,a,head+1); /再次q=p

19、ii-1*pi1;递归调用s=(pri-1+pii-1)*(pr1+pi1);pri=p-q; pii=s-p-q;t=ahead;ahead=an1-1+head;an1-1+head=t;for (it=0; it<=n-2; it=it+2)vr=frit; vi=fiit;9.快速傅立叶变换(FFT)frit=vr+frit+1; fiit=vi+fiit+1;语 法 : kkfft(doublepr,doublepi,intn,intfrit+1=vr-frit+1;k,double fr,double fi,int l,int il);fiit+1=vi-fiit+1;参数:

20、prn:输入的实部m=n/2; nv=2;pin :数入的虚部for (l0=k-2; l0>=0; l0-)n,k:满足 n=2kfrn :输出的实部m=m/2; nv=2*nv;fin :输出的虚部for (it=0; it<=(m-1)*nv; it=it+nv)l:逻辑开关, 0 FFT ,1 ifFTfor (j=0; j<=(nv/2)-1; j+)il: 逻辑开关, 0输出按实部 / 虚部; 1 输出按模 / 幅角p=prm*j*frit+j+nv/2;返回值:nullq=pim*j*fiit+j+nv/2;注意:s=prm*j+pim*j;需要 math.h源

21、程序:s=s*(frit+j+nv/2+fiit+j+nv/2);void kkfft(pr,pi,n,k,fr,fi,l,il)poddr=p-q; poddi=s-p-q;int n,k,l,il;double pr,pi,fr,fi;frit+j+nv/2=frit+j-poddr;int it,m,is,i,j,nv,l0;fiit+j+nv/2=fiit+j-poddi;double p,q,s,vr,vi,poddr,poddi;frit+j=frit+j+poddr;for (it=0; it<=n-1; it+)fiit+j=fiit+j+poddi;6精选文库doubl

22、e integral(double a,double b)if (l!=0)double h=b-a;for (i=0; i<=n-1; i+)double t1=(1+f(b)*h/2.0;int k=1;fri=fri/(1.0*n);double r1,r2,s1,s2,c1,c2,t2;fii=fii/(1.0*n);loop:double s=0.0;if (il!=0)double x=a+h/2.0;for (i=0; i<=n-1; i+)while(x<b)pri=sqrt(fri*fri+fii*fii);s+=f(x);ifx+=h;(fabs(fri)

23、<0.000001*fabs(fii)t2=(t1+h*s)/2.0;if (fii*fri)>0) pii=90.0;s2=t2+(t2-t1)/3.0;else pii=-90.0;if(k=1)elsek+;h/=2.0;t1=t2;s1=s2;goto loop;pii=atan(fii/fri)*360.0/6.283185306;c2=s2+(s2-s1)/15.0;return;if(k=2)c1=c2;k+;h/=2.0;t1=t2;s1=s2;10.Ronberg 算法计算积分goto loop;语法: result=integral(double a,doubl

24、e b);参数:r2=c2+(c2-c1)/63.0;a: 积分上限if(k=3)b: 积分下限r1=r2; c1=c2;k+;function f :积分函数h/=2.0;返回值:f 在( a,b)之间的积分值t1=t2;s1=s2;注意:goto loop;function f(x) 需要自行修改, 程序中用的是 sina(x)/xwhile(fabs(1-r1/r2)>1e-5)需要 math.hr1=r2;c1=c2;k+;默认精度要求是1e-5h/=2.0;源程序:t1=t2;s1=s2;double f(double x)goto loop;return sin(x)/x;

25、/在这里插入被积函数return r2;7精选文库11.行列式计算符合数学规则: m< n语法: result=js(int s,int n)源程序:参数:long P(long n,long m)s:行列式存储数组n: 行列式维数,递归用long p=1;返回值:行列式值while(m!=0)注意:p*=n;n-;m-;函数中常数 N为行列式维度,需自行return p;定义源程序:long C(long n,long m)int js(s,n)int sN,n;long i,c=1;i=m;int z,j,k,r,total=0;while(i!=0)int bNN;/*bNN 用于

26、存放,在矩阵c*=n;n-;i-;sNN 中元素 s0的余子式 */while(m!=0)if(n>2)c/=m;m-;return c;for(z=0;z<n;z+)for(j=0;j<n-1;j+)二、字符串处理for(k=0;k<n-1;k+)1.字符串替换if(k>=z)语法: replace(char str,char key,char swap);bjk=sj+1k+1;else bjk=sj+1k;参数:if(z%2=0) r=s0z*js(b,n-1);str:在此源字符串进行替换操作/* 递归调用 */key:被替换的字符串,不能为空串else

27、r=(-1)*s0z*js(b,n-1);swap: 替换的字符串,可以为空串,为空total=total+r;串表示在源字符中删除key返回值:null注意:else if(n=2)默认 str长度小于1000,如否,重新设total=s00*s11-s01*s10;定设定 tmp 大小return total;需要 string.h源程序:voidreplace(charstr,char key,char12.求排列组合数swap)语法: result=P(longn,long m); / result=longC(long n,long m);int l1,l2,l3,i,j,flag;

28、参数:char tmp1000;m: 排列组合的上系数l1=strlen(str);n: 排列组合的下系数l2=strlen(key);返回值:排列组合数l3=strlen(swap);注意:for (i=0;i<=l1-l2;i+)8flag=1;for (j=0;j<l2;j+)if(stri+j!=keyj)flag=0;break;if (flag)strcpy(tmp,str);strcpy(&tmpi,swap);strcpy(&tmpi+l3,&stri+l2);strcpy(str,tmp);i+=l3-1;l1=strlen(str);2.

29、字符串查找语法: result=strfind(char str,char key);参数:str:在此源字符串进行查找操作key:被查找的字符串,不能为空串返回值:如果查找成功, 返回 key 在 str中第一次出现的位置,否则返回 -1 注意:需要string.h源程序:int strfind(char str,char key)int l1,l2,i,j,flag;l1=strlen(str);l2=strlen(key);for (i=0;i<=l1-l2;i+)flag=1;for (j=0;j<l2;j+)if(stri+j!=keyj)flag=0;break;if

30、(flag) return i;return -1;精选文库3.字符串截取语 法 : mid(charstr,intstart,intlen,charstrback)参数:str:操作的目标字符串start:从第 start 个字符串开始, 截取长度为 len 的字符len:从第 start 个字符串开始, 截取长度为 len 的字符strback:截取的到的字符返回值:0:超出字符串长度,截取失败; 1:截取成功注意:需要string.h源程序:int mid(char str,int start,int len,char strback)int l,i,k=0;l=strlen(str);

31、if (start+len>l) return 0;for (i=start;i<start+len;i+)strbackk+=stri;strbackk='0'return 1;三、计算几何1.叉乘法求任意多边形面积语 法 : result=polygonarea(Point *polygon,intN);参数:*polygon :多变形顶点数组N : 多边形顶点数目返回值:多边形面积注意:支持任意多边形,凹、凸皆可多边形顶点输入时按顺时针顺序排列源程序:typedef struct double x,y; Point;double polygonarea(Poi

32、nt *polygon,int N)9int i,j;double area = 0;for (i=0;i<N;i+) j = (i + 1) % N;area += polygoni.x * polygonj.y; area -= polygoni.y * polygonj.x; area /= 2;return(area < 0 ? -area : area);2.求三角形面积语 法 : result=area3(float x1,float y1,float x2,float y2,float x3,float y3);参数:x1 3:三角形 3 个顶点 x 坐标y13:三角

33、形 3 个顶点 y 坐标返回值:三角形面积注意:需要 math.h源程序:float area3(float x1,float y1,float x2,floaty2,float x3,float y3)float a,b,c,p,s;a=sqrt(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);b=sqrt(x1-x3)*(x1-x3)+(y1-y3)*(y1-y3);c=sqrt(x3-x2)*(x3-x2)+(y3-y2)*(y3-y2);p=(a+b+c)/2;s=sqrt(p*(p-a)*(p-b)*(p-c);return s;3.两矢量间角度语 法 : result

34、=angle(double x1, double y1, double x2, double y2);参数:x/y1 2:两矢量的坐标返回值:两的角度矢量注意:返回角度为弧度制, 并且以逆时针方向为正方向精选文库需要math.h源程序:#define PI 3.1415926double angle(double x1, double y1, double x2, double y2)double dtheta,theta1,theta2;theta1 = atan2(y1,x1);theta2 = atan2(y2,x2);dtheta = theta2 - theta1;while (dt

35、heta > PI)dtheta -= PI*2;while (dtheta < -PI)dtheta += PI*2;return(dtheta);4.两点距离( 2D、 3D )语法: result=distance_2d(float x1,float x2,floaty1,float y2);参数:x/y/z1 2:各点的 x、 y、 z 坐标返回值:两点之间的距离注意:需要math.h源程序:float distance_2d(float x1,float x2,float y1,float y2)return(sqrt(x1-x2)*(x1-x2)+(y1-y2)*(y1

36、-y2); float distance_3d(float x1,float x2,float y1,float y2,float z1,float z2)return(sqrt(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1 -z2)*(z1-z2);105.射向法判断点是否在多边形内部语法: result=insidepolygon(Point *polygon,intN,Point p);参数:*polygon :多边形顶点数组N : 多边形顶点个数p: 被判断点返回值: 0:点在多边形内部; 1:点在多边形外部注意:若 p 点在多边形顶点或者边上, 返回值不确定,

37、需另行判断需要 math.h源程序:#define MIN(x,y) (x < y ? x : y) #define MAX(x,y) (x > y ? x : y) typedef struct double x,y; Point;int insidepolygon(Point *polygon,int N,Point p)int counter = 0;int i;double xinters;Point p1,p2;p1 = polygon0;for (i=1;i<=N;i+) p2 = polygoni % N;if (p.y > MIN(p1.y,p2.y)

38、if (p.y <= MAX(p1.y,p2.y) if (p.x <= MAX(p1.x,p2.x)if (p1.y != p2.y) xinters=(p.y-p1.y)*(p2.x-p1.x)/(p2.y-p1.y)+p1.x;if (p1.x =p2.x| p.x <= xinters)counter+;p1 = p2;精选文库if (counter % 2 = 0)return(OUTSIDE);elsereturn(INSIDE);6.判断点是否在线段上语法 :result=Pointonline(Pointp1,Pointp2,Point p);参数:p1、p2

39、:线段的两个端点p: 被判断点返回值:0:点在不在线段上;1:点在线段上注意:若 p 线段端点上返回1需要math.h源程序:#define MIN(x,y) (x < y ? x : y) #define MAX(x,y) (x > y ? x : y) typedef struct double x,y; Point;int FC(double x1,double x2)if(x1-x2<0.000002&&x1-x2>-0.000002)return 1; else return 0;int Pointonline(Point p1,Point p

40、2,Point p)double x1,y1,x2,y2;x1=p.x-p1.x;x2=p2.x-p1.x;y1=p.y-p1.y;y2=p2.y-p1.y;if (FC(x1*y2-x2*y1,0)=0) return 0; if(MIN(p1.x,p2.x)<=p.x&&p.x<=MAX(p1.x,p2.x)&&11(MIN(p1.y,p2.y)<=p.y&&p.y<=MAX(p1.y,p2.y )return 1; else return 0;7.判断两线段是否相交语 法 : result=sectintersect

41、(Pointp1,Pointp2,Point p3,Point p4);参数:p1 4:两条线段的四个端点返回值: 0:两线段不相交; 1:两线段相交; 2 两线段首尾相接注意:p1!=p2;p3!=p4;源程序:#define MIN(x,y) (x < y ? x : y) #define MAX(x,y) (x > y ? x : y) typedef struct double x,y; Point;int lineintersect(Point p1,Point p2,Point p3,Point p4)Point tp1,tp2,tp3;if(p1.x=p3.x&

42、;&p1.y=p3.y)|(p1.x=p4.x&&p1.y=p4.y)|(p2.x=p3.x&&p2.y=p3.y)|(p2.x=p4.x&&p2.y=p4.y)return 2;/ 快速排斥试验 if(MIN(p1.x,p2.x)<p3.x&&p3.x<MAX(p1.x,p2.x)&&MIN(p1.y,p2.y)<p3.y<MAX(p1.y,p2.y)|(MIN(p1.x,p2.x)<p4.x&&p3.x<MAX(p1.x,p2.x)&&

43、MIN(p1.y,p2.y)<p3.y<MAX(p1.y,p2.y);else return 0;/ 跨立试验 tp1.x=p1.x-p3.x; tp1.y=p1.y-p3.y; tp2.x=p4.x-p3.x; tp2.y=p4.y-p3.y; tp3.x=p2.x-p3.x;精选文库tp3.y=p2.y-p3.y;if.x)>=0) return 1; else return 0;8.判断线段与直线是否相交语 法 : result=lineintersect(Pointp1,Pointp2,Point p3,Point p4);参数:p1、p2:线段的两个端点p3、p4:

44、直线上的两个点返回值: 0:线段直线不相交; 1:线段和直线相交注意:如线段在直线上,返回 1 源程序:typedef struct double x,y; Point;int lineintersect(Point p1,Point p2,Point p3,Point p4)Point tp1,tp2,tp3;tp1.x=p1.x-p3.x;tp1.y=p1.y-p3.y;tp2.x=p4.x-p3.x;tp2.y=p4.y-p3.y;tp3.x=p2.x-p3.x;tp3.y=p2.y-p3.y;if9.点到线段最短距离语 法 : result=mindistance(Pointp1,Pointp2,Point q);参数:p1、p2:线段的两个端点q: 判断点返回值:点 q 到线段 p1p2 的距离注意:12需要 math.h源程序:#define M

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论