c语言算法Word文档格式.docx
- 文档编号:19703087
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:15
- 大小:20.31KB
c语言算法Word文档格式.docx
《c语言算法Word文档格式.docx》由会员分享,可在线阅读,更多相关《c语言算法Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
if(i==10)p=0;
%d,%d\n"
p,x[i]);
采用举穷法对满足条件的数据进行处理
例:
求1到100范围内能被2或3整除的数之和
Main()
{intI,s=0;
For(i=1;
i++)
{If(i%2==0||i%3==0)
S=s+I;
}
Printf(“%d”,s);
求N的阶乘
{intI;
s=1,n;
;
Scanf(“%d”,&
n);
=n;
S=s*I;
Printf(“%d”,s);
判断素数(穷举法)
只能被1或本身整除的数称为素数基本思想:
把m作为被除数,将2—INT(m-1)作为除数,如果都除不尽,m就是素数,否则就不是。
(可用以下程序段实现)
{intm,i,k;
pleaseinputanumber:
scanf("
%d"
&
m);
k=sqrt(m);
for(i=2;
k;
if(m%i==0)break;
if(i>
=k)
该数是素数"
else
该数不是素数"
将其写成一函数,若为素数返回1,不是则返回0
intprime(m%)
{inti,k;
if(m%i==0)return0;
return1;
四、验证哥德巴赫猜想
(任意一个大于等于6的偶数都可以分解为两个素数之和)
基本思想:
n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否
为素数,如都是,则为一组解。
如n1不是素数,就不必再检查n2是否素数。
先从n1=3开始,检验n1和n2(n2=N-n1)是否素数。
然后使n1+2再检验n1、n2是否素数,…直到n1=n/2为止。
利用上面的prime函数,验证哥德巴赫猜想的程序代码如下:
#include"
math.h"
intprime(intm)
{inti,k;
return0;
main()
{intx,i;
pleaseinputaevennumber(>
=6):
x);
if(x<
6||x%2!
=0)
dataerror!
=x/2;
if(prime(i)&
&
prime(x-i))
{
%d+%d\n"
i,x-i);
验证成功!
"
break;
五、排序问题
1.选择法排序(升序)
基本思想:
1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置;
2)除第1个数外,其余n-1个数中选最小的数,与第2个数交换位置;
3)依次类推,选择了n-1次后,这个数列已按升序排列。
程序代码如下:
{inti,j,imin,s,a[10];
\ninput10numbers:
10;
a[i]);
9;
{imin=i;
for(j=i+1;
j<
j++)
if(a[imin]>
a[j])imin=j;
if(i!
=imin)
{s=a[i];
a[i]=a[imin];
a[imin]=s;
}
%d\n"
2.冒泡法排序(升序)
(将相邻两个数比较,小的调到前头)
1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”;
2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数;
3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。
程序段如下
{inta[10];
inti,j,t;
input10numbers\n"
for(j=0;
=8;
9-j;
if(a[i]>
a[i+1])
{t=a[i];
a[i]=a[i+1];
a[i+1]=t;
thesortednumbers:
3.合并法排序(将两个有序数组A、B合并成另一个有序的数组C,升序)
1)先在A、B数组中各取第一个元素进行比较,将小的元素放入C数组;
2)取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上述
比较过程,直到某个数组被先排完;
3)将另一个数组剩余元素抄入C数组,合并排序完成。
程序段如下:
{inta[10],b[10],c[20],i,ia,ib,ic;
pleaseinputthefirstarray:
b[i]);
ia=0;
ib=0;
ic=0;
while(ia<
10&
ib<
10)
{if(a[ia]<
b[ib])
{c[ic]=a[ia];
ia++;
{c[ic]=b[ib];
ib++;
ic++;
=9)
while(ib<
b++;
20;
c[i]);
六、查找问题
1.①顺序查找法(在一列数中查找某数x)
一列数放在数组a[1]---a[n]中,待查找的数放在x中,把x与a数组中的元素从头到尾一一进行比较查找。
用变量p表示a数组元素下标,p初值为1,使x与a[p]比较,如果x不等于a[p],则使p=p+1,不断重复这个过程;
一旦x等于a[p]则退出循环;
另外,如果p大于数组长度,循环也应该停止。
(这个过程可由下语句实现)
{inta[10],p,x,i;
pleaseinputthearray:
pleaseinputthenumberyouwantfind:
p=0;
while(x!
=a[p]&
p<
p++;
if(p>
=10)
thenumberisnotfound!
thenumberisfoundtheno%d!
p);
思考:
将上面程序改写一查找函数Find,若找到则返回下标值,找不到返回-1
②基本思想:
一列数放在数组a[1]---a[n]中,待查找的关键值为key,把key与a数组中的元素从头到尾一一进行比较查找,若相同,查找成功,若找不到,则查找失败。
(查找子过程如下。
index:
存放找到元素的下标。
)
{inta[10],index,x,i;
index=-1;
if(x==a[i])
{index=i;
break;
if(index==-1)
index);
2.折半查找法(只能对有序数列进行查找)
设n个有序数(从小到大)存放在数组a[1]----a[n]中,要查找的数为x。
用变量bot、top、mid分别表示查找数据范围的底部(数组下界)、顶部(数组的上界)和中间,mid=(top+bot)/2,折半查找的算法如下:
(1)x=a(mid),则已找到退出循环,否则进行下面的判断;
(2)x<
a(mid),x必定落在bot和mid-1的范围之内,即top=mid-1;
(3)x>
a(mid),x必定落在mid+1和top的范围之内,即bot=mid+1;
(4)在确定了新的查找范围后,重复进行以上比较,直到找到或者bot<
=top。
将上面的算法写成如下程序:
inta[10],mid,bot,top,x,i,find;
bot=0;
top=9;
find=0;
while(bot<
top&
find==0)
{mid=(top+bot)/2;
if(x==a[mid])
{find=1;
elseif(x<
a[mid])
top=mid-1;
bot=mid+1;
if(find==1)
mid);
七、插入法
把一个数插到有序数列中,插入后数列仍然有序
n个有序数(从小到大)存放在数组a
(1)—a(n)中,要插入的数x。
首先确定x插在数组中的位置P;
(可由以下语句实现)
#defineN10
voidinsert(inta[],intx)
{intp,i;
while(x>
a[p]&
N)
for(i=N;
i>
p;
i--)
a[i]=a[i-1];
a[p]=x;
{inta[N+1]={1,3,4,7,8,11,13,18,56,78},x,i;
i<
N;
i++)printf("
%d,"
a[i]);
\nInputx:
&
insert(a,x);
=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
[L],intb[L][N],intc
[N])
{inti,j,k;
M;
i++)
j<
j++)
{c[i][j]=0;
for(k=0;
k<
L;
k++)
c[i][j]+=a[i][k]*b[k][j];
{inta
[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
[N];
inti,j;
mv(a,b,c);
{for(j=0;
c[i][j]);
(3)矩阵传置
例:
有二维数组a(5,5),要对它实现转置,可用下面两种方式:
voidch1(inta[N][N])
{inti,j,t;
{t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t;
voidch2(inta[N][N])
for(j=0;
i;
{inta[N][N]={{1,2,3},{4,5,6},{7,8,9}},i,j;
ch1(a);
/*或ch2(a);
*/
a[i][j]);
(4)求二维数组中最小元素及其所在的行和列
基本思路同一维数组,可用下面程序段实现(以二维数组a[3][4]为例):
‘变量max中存放最大值,row,column存放最大值所在行列号
#defineN4
#defineM3
voidmin(inta
{intmin,row,column,i,j;
min=a[0][0];
row=0;
column=0;
if(a[i][j]<
min)
{min=a[i][j];
row=i;
column=j;
Min=%d\nAtRow%d,Column%d\n"
min,row,column);
[N]={{1,23,45,-5},{5,6,-7,6},{0,33,8,15}};
min(a);
九、迭代法
算法思想:
对于一个问题的求解x,可由给定的一个初值x0,根据某一迭代公式得到一个新的值x1,这个新值x1比初值x0更接近要求的值x;
再以新值作为初值,即:
x1→x0,重新按原来的方法求x1,重复这一过和直到|x1-x0|<
ε(某一给定的精度)。
此时可将x1作为问题的解。
用迭代法求某个数的平方根。
已知求平方根的迭代公式为:
#include<
math.h>
floatfsqrt(floata)
{floatx0,x1;
x1=a/2;
do{
x0=x1;
x1=0.5*(x0+a/x0);
}while(fabs(x1-x0)>
0.00001);
return(x1);
{floata;
%f"
a);
genhao=%f\n"
fsqrt(a));
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 算法