elsebot=mid+1;
}
if(find==1)printf("thenumberisfoundtheno%d!
\n",mid);else
printf("thenumberisnotfound!
\n");
}
七、插入法把一个数插到有序数列中,插入后数列仍然有序
基本思想:
n个有序数(从小到大)存放在数组a
(1)—a(n)中,要插入的数X。
首先确定x插在数组中的位置P;(可由以下语句实现)
#defineN10voidinsert(inta[],intx)
{intp,i;
p=0;
while(x>a[p]&&pp++;
for(i=N;i>p;i--)
a[i]=a[i-1];
a[p]=x;
}
main()
{inta[N+1]={1,3,4,7,8,11,13,18,56,78},x,i;
for(i=0;i");
scanf("%d",&x);
insert(a,x);
for(i=0;i<=N;i++)printf("%d,",a[i]);printf("\n");
}
八、矩阵(二维数组)运算
(1)矩阵的加、减运算
C(i,j)=a(i,j)+b(i,j)加法
C(i,j)=a(i,j)-b(i,j)减法
(2)矩阵相乘
(矩阵A有M*L个元素,矩阵B有L*N个元素,则矩阵C=A*B有M*N个元素)。
矩阵C中任一元素(i=1,2,…,m;j=1,2,…,n)
#defineM2
#defineL4
#defineN3
voidmv(inta[M][L],intb[L][N],intc[M][N])
{inti,j,k;
for(i=0;ifor(j=0;j{c[i][j]=0;
for(k=0;kc[i][j]+=a[i][k]*b[k][j];
}
}
main()
{inta[M][L]={{1,2,3,4},{1,1,1,1}};
intb[L][N]={{1,1,1},{1,2,1},{2,2,1},{2,3,1}},c[M][N];
inti,j;
mv(a,b,c);
for(i=0;i{for(j=0;jprintf("%4d",c[i][j]);
printf("\n");
}
}
(3)矩阵转置
算法思想:
指将矩阵中元素的行下标和列下标交换,形成的新矩阵就是原矩阵的转置矩阵。
在转置方阵时须注意,只用遍历方阵的上三角形(或下三角形),将其中的元素和其对应元素进行一次交换即可。
如果是遍历整个方阵,并将每个元素都和它对应元素交换,结果会发现方阵没有发生变化,原因是每个元素都做了两次交换,最终又换回到原来的位置上。
例:
有二维数组a(5,5),要对它实现转置,可用下面两种方
式:
#defineN3
voidch1(inta[N][N])/*只遍历方阵的上三角形*/
{inti,j,t;
for(i=0;ifor(j=i+1;j{t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;
}
}
voidch2(inta[N][N])/*只遍历方阵的下三角形*/{inti,j,t;
for(i=1;ia[i][j]=a[j][i];a[j][i]=t;
}
}main()
{inta[N][N]={{1,2,3},{4,5,6},{7,8,9}},i,j;ch1(a);/*或ch2(a);*/for(i=0;i{for(j=0;j}
(4)求二维数组中最小元素及其所在的行和列基本思路同一维数组,可用下面程序段实现(以二维数组a[3][4]为例):
‘变量minx中存放最小值,row,column存放最小值所在行列号
#defineN4
#defineM3
voidmin(inta[M][N])
{intmin,row,column,i,j;
min=a[0][0];
row=0;
column=0;
for(i=0;ifor(j=0;j{min=a[i][j];
row=i;
column=j;
}
printf("Min=%d\nAtRow%d,Column%d\n",min,row,column);
}main()
{inta[M][N]={{1,23,45,-5},{5,6,-7,6},{0,33,8,15}};min(a);
}
九、迭代法
算法思想:
对于一个问题的求解X,可由给定的一个初值
X0,根据某一迭代公式得到一个新的值x1,这个新值x1比初值X0更接近要求的值X;再以新值作为初值,即:
Xi—X0,重新按原来的方法求Xi,重复这一过和直到|x1-xO|<£(某一给定的精度)。
此时可将X1作为问题的解。
例:
用迭代法求某个数的平方根。
已知求平方根的迭代公式为:
#include
floatfsqrt(floata)
{floatX0,Xi;
Xi=a/2;
do{
X0=Xi;
Xi=0.5*(X0+a/X0);
}while(fabs(Xi-X0)>0.0000i);
return(Xi);
}
main()
{floata;
scanf("%f",&a);
printf("genhao=%f\n",fsqrt(a));
}
十、数制转换
将一个十进制整数m转换成-r(2—16)进制字符串。
方法:
将m不断除r取余数,直到商为零,以反序得到结果。
下面写出一转换函数,参数idee为十进制数,ibase为要转换成数的基(如二进制的基是2,八进制的基是8等),函数输出结果是字符串。
char*trdee(intidee,intibase)
{charstrdr[20],t
inti,idr,p=0;
while(idec!
=O)
{idr=idec%ibase;
if(idr>=10)
strdr[p++]=idr-10+65;
else
strdr[p++]=idr+48;
idec/=ibase;
for(i=0;ivp/2;i++){t=strdr[i];strdr[i]=strdr[p-i-1];strdr[p-i-1]=t;
}strdr[p]='\0';
}
main()
{intx,d;
scanf("%d%d",&x,&d);
printf("%s\n",trdec(x,d));
}
return(strdr);
}
十一、字符串的一般处理
1.简单加密和解密
加密的思想是:
将每个字母C加(或减)一序数K,即用它后的第K个字母代替,变换式公式:
c=c+k
例如序数k为5,这时A-F,a-f,B-?
G-当加序
数后的字母超过Z或z则c=c+k-26
例如:
Youaregood—DtzfwjItti
解密为加密的逆过程
将每个字母C减(或加)一序数K,即c=c-k,
例如序数k为5,这时Z—U,z—u,丫—T…当加序数后的字母小于A或a则c=c-k+26
下段程序是加密处理:
#incIude
char*jiami(charstri[])
{inti=0;
charstrp[50],ia;
whiIe(stri[i]!
='\0')
{if(stri[i]>='A'&&stri[i]<='Z')
{ia=stri[i]+5;
if(ia>'Z')ia-=26;
}
elseif(stri[i]>='a'&&stri[i]<='z'){ia=stri[i]+5;
if(ia>'z'