C++常用算法归纳.docx

上传人:b****3 文档编号:603865 上传时间:2022-10-11 格式:DOCX 页数:17 大小:20.46KB
下载 相关 举报
C++常用算法归纳.docx_第1页
第1页 / 共17页
C++常用算法归纳.docx_第2页
第2页 / 共17页
C++常用算法归纳.docx_第3页
第3页 / 共17页
C++常用算法归纳.docx_第4页
第4页 / 共17页
C++常用算法归纳.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

C++常用算法归纳.docx

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

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;b

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

当前位置:首页 > 工程科技 > 电力水利

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

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