C++常用算法归纳Word格式文档下载.docx
《C++常用算法归纳Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C++常用算法归纳Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
![C++常用算法归纳Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-10/11/9db04c70-880d-4a6b-96f7-45abd2e1daad/9db04c70-880d-4a6b-96f7-45abd2e1daad1.gif)
【法2:
让a中放较小数、b中放较大数】
intt;
//中间变量
a>
(t=a,a=b,b=t):
(a=a,b=b);
cout<
endl;
【算法解释:
“t=a,a=b,b=t”,即可借助t,将a和b的值交换。
】
2、累加
求1+2+3+……+100的和。
{ints,i;
s=0;
i=1;
while(i<
=100)
{s=s+i;
i=i+1;
"
1+2+...+100="
s;
【分析:
出循环时,i为101,其最后一个合法取值(终值)为100;
本题中s被称为累加器,它以“s=s+……”的形式出现在循环中,该式被称为累加式,累加器在进入循环前必须获得合法初值,通常为0。
i是一个特殊的累加器,每次递增1,又称为计数器。
i身兼二职:
控制循环的次数,同时兼做累加式的通项。
3、累乘
例.求10!
。
10!
=1×
2×
3……×
10,累乘器在进入循环前必须获得合适初值;
通常为1。
累乘式格式“C=C*……”必须出现在循环中。
注意,不要让累乘器溢出。
{longC;
inti;
C=1;
i=1;
while(i<
=10)
{C=C*i;
i++;
}
C<
【思考:
能否将本程序稍做修改,分别输出1!
~10!
二、非数值计算常用经典算法
1、穷举法
对所有的可能性进行判断,凡是符合条件的做相应处理(输出、保存等)。
输出所有的“水仙花”数,即这样的三位正整数:
其每一数位上的数字的立方之和等于该数本身。
比如,153=13+53+33。
【法一:
一重循环,难点:
求出每位数字】
{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)
【结论:
任意一个正整数的个位数字,都可以用“该数%10”求得!
【法二:
三重循环】
{intb,s,g;
for(b=1;
=9;
b++)//时针
for(s=0;
s<
s++)//分针
for(g=0;
g<
g++)//秒针
if(b*b*b+s*s*s+g*g*g==b*100+s*10+g)
b*100+s*10+g<
【发现:
核心语句if被执行了900次】
2、正整数的各数位上数字的获取
例1:
任意读入一个正整数,依次输出其低位到高位上的每一位数字。
例2:
任意读入一个整数,依次输出其低位到高位上的每一位数字与其符号位,但若是0不输出符号位。
3、迭代法
例1.猴子吃桃问题。
某猴子某天摘了若干只桃子,吃了一半,不过瘾,又多吃一只;
第二天又吃了一半,不过瘾,再多吃一只……到第十天,发现只剩1只桃子了。
问第一天共摘了多少只桃子。
{intpeach,day;
peach=1;
for(day=9;
day>
=1;
day--)
peach=(peach+1)*2;
第一天的桃子数:
peach;
【归纳:
类似于本题peach变量的特点:
其值不停地被新值替代(自身的原值变化而来),直到满足所求终止。
【问题:
能否将上述程序稍作修改,输出每一天的桃子数。
{peach=(peach+1)*2;
第"
day<
天的桃子数:
peach<
4、排序
(1)冒泡排序法(起泡法)
【算法要领:
n个数据最多处理n-1趟,每一趟从头到尾(或从尾到头)两两相邻的元素进行比较,升序排序时,若前者大后者小,则交换两数……,每一趟比前一趟少比较一次。
任意读入10个整数,升序排列后输出。
{constintN=10;
inta[N],i,j;
for(i=0;
i<
N;
i++)
a[i];
//外循环处理N-1趟,控制趟数
for(j=1;
j<
=N-1;
j++)
=N-1-j;
//内循环控制每趟比较次数
if(a[i]>
a[i+1])
{intt;
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
a[i]<
'
;
(2)选择法排序
选择法排序是相对好理解的排序算法。
假设要对含有n个数的序列进行升序排列,算法步骤是:
①从数组存放的n个数中找出最小数的下标(算法见下面的“求最值”),然后将最小数与第1个数交换位置;
②除第1个数以外,再从其余n-1个数中找出最小数(即n个数中的次小数)的下标,将此数与第2个数交换位置;
③重复步骤①n-1趟,即可完成所求。
任意读入10个数,然后进行升序排列。
【主函数—读入、调用、输出;
子函数—排序。
voidPX(int*p,intn)//【法1:
选择法】
{inti,j,k,t;
=n-2;
{k=i;
for(j=i+1;
=n-1;
if(*(p+j)<
*(p+k))k=j;
if(k!
=i)
{t=*(p+i);
*(p+i)=*(p+k);
*(p+k)=t;
voidmain()
{inta[10],i;
10;
PX(a,10);
//为增大子函数灵活性,将元素个数传过去
//【法2:
以下冒泡法】
iomanip>
voidPX(int*p,intn)
{inti,j;
=n-1-j;
if(*(p+i)>
*(p+i+1))
*(p+i)=*(p+i+1);
*(p+i+1)=t;
{inta[10],i;
PX(a,10);
setw(4)<
5、查找:
顺序查找(线性查找)
任意读入10个数,查找其中有无9这个数。
inta[N],i;
i++)//正常出口出来,i为N
if(a[i]==9)break;
if(i<
N)
有"
else
无"
【小技巧:
定义一个逻辑量】
boolflag=false;
//先假设无
if(a[i]==9){flag=true;
break;
if(flag!
=false)
【用while改写】
i++)cin>
i=0;
=N-1&
&
a[i]!
=9)i++;
=N-1)
6、判断素数(质数)
数学定义:
“凡是只能被1和自身整除的大于1的整数,就称为质数,即素数。
”
【换句话,即“不能被‘2~自身-1’整除”】
例1.任意读入一个大于1的整数,判断其是否为素数。
紧扣数学定义】
{intx;
do
{cout<
x>
1:
\n"
x;
}while(x<
=1);
intk;
for(k=2;
k<
=x-1;
k++)//穷举的思维
if(x%k==0)break;
if(x==k)//判断难点
x<
是素数\n"
不是素数\n"
【用一个小技巧:
借助一个“逻辑型”变量:
“是素数时为true,否则为false”】
boolflag;
flag=true;
//首先假设x是素数!
if(x%k==0)
{flag=false;
b