最新C++常用算法归纳.docx

上传人:b****8 文档编号:29910775 上传时间:2023-08-03 格式:DOCX 页数:20 大小:20.83KB
下载 相关 举报
最新C++常用算法归纳.docx_第1页
第1页 / 共20页
最新C++常用算法归纳.docx_第2页
第2页 / 共20页
最新C++常用算法归纳.docx_第3页
第3页 / 共20页
最新C++常用算法归纳.docx_第4页
第4页 / 共20页
最新C++常用算法归纳.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

最新C++常用算法归纳.docx

《最新C++常用算法归纳.docx》由会员分享,可在线阅读,更多相关《最新C++常用算法归纳.docx(20页珍藏版)》请在冰豆网上搜索。

最新C++常用算法归纳.docx

最新C++常用算法归纳

C++常用算法归纳

一、基本算法

1、两数交换借助第三数

例:

任意读入2个整数,然后按从小到大的顺序输出这两个数。

【法1】

#include

usingnamespacestd;

voidmain()

{inta,b;

cin>>a>>b;

a

cout<

cout<

}

【法2:

让a中放较小数、b中放较大数】

#include

usingnamespacestd;

voidmain()

{inta,b;

cin>>a>>b;

intt;//中间变量

a>b?

(t=a,a=b,b=t):

(a=a,b=b);

cout<

}

【算法解释:

“t=a,a=b,b=t”,即可借助t,将a和b的值交换。

2、累加

例:

求1+2+3+……+100的和。

#include

usingnamespacestd;

voidmain()

{ints,i;

s=0;

i=1;

while(i<=100)

{s=s+i;

i=i+1;

}

cout<<"1+2+...+100="<

}

【分析:

出循环时,i为101,其最后一个合法取值(终值)为100;本题中s被称为累加器,它以“s=s+……”的形式出现在循环中,该式被称为累加式,累加器在进入循环前必须获得合法初值,通常为0。

i是一个特殊的累加器,每次递增1,又称为计数器。

i身兼二职:

控制循环的次数,同时兼做累加式的通项。

3、累乘

例.求10!

【分析:

10!

=1×2×3……×10,累乘器在进入循环前必须获得合适初值;通常为1。

累乘式格式“C=C*……”必须出现在循环中。

注意,不要让累乘器溢出。

#include

usingnamespacestd;

voidmain()

{longC;

inti;

C=1;

i=1;

while(i<=10)

{C=C*i;

i++;

}

cout<

}

【思考:

能否将本程序稍做修改,分别输出1!

~10!

二、非数值计算常用经典算法

1、穷举法

对所有的可能性进行判断,凡是符合条件的做相应处理(输出、保存等)。

例:

输出所有的“水仙花”数,即这样的三位正整数:

其每一数位上的数字的立方之和等于该数本身。

比如,153=13+53+33。

【法一:

一重循环,难点:

求出每位数字】

#include

usingnamespacestd;

voidmain()

{intsxh;

intb,s,g;

for(sxh=100;sxh<=999;sxh++)

{b=sxh/100;

s=sxh/10%10;

g=sxh%10;

if(b*b*b+s*s*s+g*g*g==sxh)

cout<

}

}

【结论:

任意一个正整数的个位数字,都可以用“该数%10”求得!

【法二:

三重循环】

#include

usingnamespacestd;

voidmain()

{intb,s,g;

for(b=1;b<=9;b++)//时针

for(s=0;s<=9;s++)//分针

for(g=0;g<=9;g++)//秒针

if(b*b*b+s*s*s+g*g*g==b*100+s*10+g)

cout<

}

【发现:

核心语句if被执行了900次】

2、正整数的各数位上数字的获取

例1:

任意读入一个正整数,依次输出其低位到高位上的每一位数字。

例2:

任意读入一个整数,依次输出其低位到高位上的每一位数字及其符号位,但若是0不输出符号位。

3、迭代法

例1.猴子吃桃问题。

某猴子某天摘了若干只桃子,吃了一半,不过瘾,又多吃一只;第二天又吃了一半,不过瘾,再多吃一只……到第十天,发现只剩1只桃子了。

问第一天共摘了多少只桃子。

#include

usingnamespacestd;

voidmain()

{intpeach,day;

peach=1;

for(day=9;day>=1;day--)

peach=(peach+1)*2;

cout<<"第一天的桃子数:

"<

}

【归纳:

类似于本题peach变量的特点:

其值不停地被新值替代(自身的原值变化而来),直到满足所求终止。

【问题:

能否将上述程序稍作修改,输出每一天的桃子数。

#include

usingnamespacestd;

voidmain()

{intpeach,day;

peach=1;

for(day=9;day>=1;day--)

{peach=(peach+1)*2;

cout<<"第"<

"<

}

4、排序

(1)冒泡排序法(起泡法)

【算法要领:

n个数据最多处理n-1趟,每一趟从头到尾(或从尾到头)两两相邻的元素进行比较,升序排序时,若前者大后者小,则交换两数……,每一趟比前一趟少比较一次。

例:

任意读入10个整数,升序排列后输出。

#include

usingnamespacestd;

voidmain()

{constintN=10;

inta[N],i,j;

for(i=0;i

cin>>a[i];

//外循环处理N-1趟,控制趟数

for(j=1;j<=N-1;j++)

for(i=0;i<=N-1-j;i++)

//内循环控制每趟比较次数

if(a[i]>a[i+1])

{intt;

t=a[i];a[i]=a[i+1];a[i+1]=t;}

for(i=0;i

cout<

}

(2)选择法排序

选择法排序是相对好理解的排序算法。

假设要对含有n个数的序列进行升序排列,算法步骤是:

①从数组存放的n个数中找出最小数的下标(算法见下面的“求最值”),然后将最小数与第1个数交换位置;

②除第1个数以外,再从其余n-1个数中找出最小数(即n个数中的次小数)的下标,将此数与第2个数交换位置;

③重复步骤①n-1趟,即可完成所求。

例:

任意读入10个数,然后进行升序排列。

【主函数—读入、调用、输出;子函数—排序。

#include

usingnamespacestd;

voidPX(int*p,intn)//【法1:

选择法】

{inti,j,k,t;

for(i=0;i<=n-2;i++)

{k=i;

for(j=i+1;j<=n-1;j++)

if(*(p+j)<*(p+k))k=j;

if(k!

=i)

{t=*(p+i);*(p+i)=*(p+k);*(p+k)=t;}

}

}

voidmain()

{inta[10],i;

for(i=0;i<10;i++)

cin>>a[i];

PX(a,10);//为增大子函数灵活性,将元素个数传过去

for(i=0;i<10;i++)

cout<

}

//【法2:

以下冒泡法】

#include

#include

usingnamespacestd;

voidPX(int*p,intn)

{inti,j;intt;

for(j=1;j<=n-1;j++)

for(i=0;i<=n-1-j;i++)

if(*(p+i)>*(p+i+1))

{t=*(p+i);*(p+i)=*(p+i+1);

*(p+i+1)=t;}

}

voidmain()

{inta[10],i;

for(i=0;i<10;i++)

cin>>a[i];

PX(a,10);

for(i=0;i<10;i++)

cout<

}

5、查找:

顺序查找(线性查找)

例:

任意读入10个数,查找其中有无9这个数。

#include

usingnamespacestd;

voidmain()

{constintN=10;

inta[N],i;

for(i=0;i

cin>>a[i];

for(i=0;i

if(a[i]==9)break;

if(i

cout<<"有"<

else

cout<<"无"<

}

【小技巧:

定义一个逻辑量】

#include

usingnamespacestd;

voidmain()

{constintN=10;

inta[N],i;

boolflag=false;//先假设无

for(i=0;i

cin>>a[i];

for(i=0;i

if(a[i]==9){flag=true;break;}

if(flag!

=false)

cout<<"有"<

else

cout<<"无"<

}

【用while改写】

#include

usingnamespacestd;

voidmain()

{constintN=10;

inta[N],i;

for(i=0;i>a[i];

i=0;

while(i<=N-1&&a[i]!

=9)i++;

if(i<=N-1)

cout<<"有"<

else

cout<<"无"<

}

6、判断素数(质数)

数学定义:

“凡是只能被1和自身整除的大于1的整数,就称为质数,即素数。

【换句话,即“不能被‘2~自身-1’整除”】

例1.任意读入一个大于1的整数,判断其是否为素数。

【法一:

紧扣数学定义】

#include

usingnamespacestd;

voidmain()

{intx;

do

{cout<<"x>1:

\n";

cin>>x;

}while(x<=1);

intk;

for(k=2;k<=x-1;k++)//穷举的思维

if(x%k==0)break;

if(x==k)//判断难点

cout<

else

cout<

}

【用一个小技巧:

借助一个“逻辑型”变量:

“是素数时为true,否则为false”】

#include

usingnamespacestd;

voidmain()

{intx;

do

{cout<<"x>1:

\n";

cin>>x;

}while(x<=1);

intk;

boolflag;

flag=true;//首先假设x是素数!

for(k=2;k<=x-1;k++)//穷举的思维

if(x%k==0)

{flag=false;break;}

if(flag==true)

cout<

else

cout<

}

【用while改写】

#include

usingnamespacestd;

voidmain()

{intx,k;

cin>>x;

k=2;

while(x%k!

=0)k++;

if(k==x)

cout<

else

cout<

}

【变形一:

用sqrt函数,求平方根】

#include

#include

usingnamespacestd;

voidmain()

{intx,k;

cin>>x;

boolflag=true;

for(k=2;k<=sqrt(x);k++)

if(x%k==0){flag=false;break;}

if(flag==true)

cout<

else

cout<

}

7、插入、删除

三、数值计算经典算法:

1、辗转相除法求两正整数的最大公约数

例:

任意读入2个正整数,输出其最大公约数。

#include

usingnamespacestd;

voidmain()

{intx,y,r;

do

{cout<<"输入x>0、y>0:

\n";

cin>>x>>y;

}while(!

(x>0&&y>0));

r=x%y;

while(r!

=0)

{x=y;y=r;r=x%y;}

cout<

}

【改写:

用do……while】

#include

usingnamespacestd;

voidmain()

{intx,y,r;

do

{cout<<"输入x>0、y>0:

\n";

cin>>x>>y;

}while(!

(x>0&&y>0));

do

{r=x%y;

x=y;

y=r;

}while(r!

=0);

cout<

}

2.级数计算(展开式的求解)

例1、求1+1/2!

+1/3!

+…+1/n!

+…,直到某项的值小于10-6为止。

【法一:

直接法(略)】

【法二:

间接法(递推法)前项/项次=后项】

#include

usingnamespacestd;

voidmain()

{floats,t;

inti;//表示项次

s=0;t=1;i=1;

while(t>=1e-6)

{s=s+t;

i++;

t=t/i;

}

cout<

}

例2、读入0

【法一:

直接法:

直接利用项次描述通项。

#include

#include

usingnamespacestd;

voidmain()

{floatx,s,t;

inti;//能用整数,不用实数

do

{cout<<"0

cin>>x;

}while(x>=1||x<=0);

i=1;

s=0.0;

t=x;

while(t>=1e-6)

{s=s+t;

i++;

t=pow(x,i);

}

cout<

}

3、间接法求通项

例1、读入0

【法二:

递推法(间接法)求通项:

利用前项求后项。

【分析:

本题中若前一项值为t,则后一项的值为t*x】

#include

usingnamespacestd;

voidmain()

{floatx,s;

do

{cout<<"0

cin>>x;

}while(x>=1||x<=0);

floatt;//用t表示通项

s=0.0;t=x;

while(t>=1e-6)

{s=s+t;

t=t*x;}

cout<

}

例2、求斐比利斯数列的前20项。

1、1、2、3、5、8、13……(制定前两项,第三项开始总是前两项之和。

【分析:

本题只能有间接法(递推法),利用前2项求后1项。

#include

usingnamespacestd;

voidmain()

{intf1,f2,f3;

f1=f2=1;

cout<

inti;

for(i=3;i<=20;i++)

{f3=f1+f2;

f1=f2;

f2=f3;

cout<

}

}

例3、编程输出形如上图的等腰三角形(行数灵活读入)。

*

***

*****

*******

#include

usingnamespacestd;

voidmain()

{inth;

cout<<"读入行数>=1"<

cin>>h;

inti=1,j;//用二重循环完成(循环的嵌套)

while(i<=h)//外循环控制行数

{for(j=1;j<=h-i;j++)//第一个循环输出每行的空格

cout<<'';

for(j=1;j<=2*i-1;j++)//第二个循环输出每行的星号

cout<<'*';

cout<

i++;

}

}

4、矩阵转置

矩阵转置的算法要领是:

将一个m行n列矩阵(即m×n矩阵)的每一行转置成另一个n×m矩阵的相应列。

例、将以下2×3矩阵转置后输出。

即将123转置成14

45625

36

#include

#include

usingnamespacestd;

voidmain()

{inta[2][3],b[3][2],i,j,k=1;

for(i=0;i<2;i++)

for(j=0;j<3;j++)

a[i][j]=k++;

//将a转置到b中,穷举

for(i=0;i<2;i++)//以a为基准

for(j=0;j<3;j++)

b[j][i]=a[i][j];

for(i=0;i<3;i++)

{for(j=0;j<2;j++)

cout<

cout<

}

5、杨辉三角形

杨辉三角形的每一行是(x+y)n的展开式各项的系数。

例如第一行是(x+y)0,其系数为1;第二行是(x+y)1,其系数为1,1;第三行是(x+y)2,其展开式为x2+2xy+y2,系数分别为1,2,1;……直观形式如下:

1

11

121

1331

14641

15101051

……

分析以上形式,可以发现其规律:

是n阶方阵的下三角,第一列和主对角线均为1,其余各元素是它的上一行、同一列元素与上一行、前一列元素之和。

例、编程输出杨辉三角形的前10行。

#include

#include

usingnamespacestd;

voidmain()

{constintN=10;

inta[N][N],i,j;

//给主对角线、第一列元素赋值

for(i=0;i

a[i][i]=a[i][0]=1;

//以下双循环完成其他元素赋值

for(i=2;i<=N-1;i++)

for(j=1;j<=i-1;j++)

a[i][j]=a[i-1][j-1]+a[i-1][j];

for(i=0;i

{for(j=0;j<=i;j++)

附件

(二):

cout<

9、如果你亲戚朋友送你一件DIY手工艺制品你是否会喜欢?

cout<

动漫书籍□化妆品□其他□}

}

十几年的学校教育让我们大学生掌握了足够的科学文化知识,深韵的文化底子为我们创业奠定了一定的基础。

特别是在大学期间,我们学到的不单单是书本知识,假期的打工经验也帮了大忙。

6、求最值(最大、最小)

(二)上海的人口环境对饰品消费的影响例、任意读入10个整数,输出其中的最大值。

#include

(一)创业机会分析usingnamespacestd;

(一)上海的经济环境对饰品消费的影响voidmain()

{constintN=10;

朋友推荐□宣传广告□逛街时发现的□上网□inta[N],i;

intmax;

for(i=0;i>a[i];

max=a[0];//假设第一个获最后一个最大

for(i=1;i

if(a[i]>max)max=a[i];

图1-1大学生月生活费分布cout<<"MAX="<

培养动手能力□学一门手艺□打发时间□兴趣爱好□}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 临床医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1