C++算法汇总.docx

上传人:b****5 文档编号:6102820 上传时间:2023-01-03 格式:DOCX 页数:61 大小:46.97KB
下载 相关 举报
C++算法汇总.docx_第1页
第1页 / 共61页
C++算法汇总.docx_第2页
第2页 / 共61页
C++算法汇总.docx_第3页
第3页 / 共61页
C++算法汇总.docx_第4页
第4页 / 共61页
C++算法汇总.docx_第5页
第5页 / 共61页
点击查看更多>>
下载资源
资源描述

C++算法汇总.docx

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

C++算法汇总.docx

C++算法汇总

说明:

●实验指导书相关习题与教材每章书后习题基本重复,以下内容均以教材例题及教材书后习题为背景汇总,仅列出教材上的样关算法及出处。

●在模仿教材例题或按书后要求编写算法程序时,需考虑算法所基于的数据结构和实现的场合。

⏹算法所基于的数据结构:

普通变量、指针、引用、结构体、类

⏹算法实现的场合:

在main()函数中实现、自定义函数实现、在类中的成员函数实现、类的友元函数实现等。

●以下所例算法在第8章指针部分均有对应实现要求

1、比较大小(整型、实型、字符型、字符串):

●两个数据比较大小

●三个整型数据比较大小(P50)

●/*从键盘上输入三个整数,输出三个数中的最大数。

●分析:

先读入三个数,求出前两个数中的大数,再求出该大数与第三个数之间的最大数。

voidmain(void)

●{inta,b,c,max;

●cout<<"输入三个整数:

";

●cin>>a>>b>>c;

●max=a;//A

●if(max

●if(max

●cout<<"\n最大数是"<

●/*A、B、C三行可用下列语句替代:

●if(a>b)max=a;elsemax=b;

●cout<<"\n最大数是";

●if(max>c)cout<

●*/

●}

●/*编写程序,输入一个三位正整数,输出各位数字组成的最大值。

例如:

输入“123”,输出“321”。

●intmain(void)

●{

●inta,b,c,max,mid,min,x;

●cout<<"输入一个三位正整数:

";

●cin>>x;

●a=int(x/100);

●b=int((x-a*100)/10);

●c=int(x-a*100-b*10);

●//分别得出该三位数的每一位上的值,并分别赋给a,b,c

●max=a;

●if(b>a)max=b;

●if(max

●//求出三个数的最大值

●mid=b;

●if(a

●if(a

●//求出三个数的中间值

●min=a;

●if(a>b)min=b;

●if(c

●//求出三个数的最小值

●cout<

"<

●return0;

●}

2、分段函数的计算(P77第3、4题)

/*编写程序,根据输入的x的值,按下列公式计算并输出y的值

当-5<=x<=5且x!

=0时y=x-1

当x=0时y=x+1

当5

当x为其他值时y=100*/

intmain(void)

{

intx,y;

cout<<"请输入一个x:

";

cin>>x;

if(-5<=x&&x<=5&&x!

=0)

cout<<"y=x-1"<<"即y等于:

"<

elseif(x==0)

cout<<"y=x+1"<<"即y等于:

"<

elseif(5

cout<<"y=x+5"<<"即y等于:

"<

else

cout<<"y="<<100;

cout<

return0;

}

/*编写程序,输入一个三位正整数,输出各位数字组成的最大值。

例如:

输入“123”,输出“321”。

*/

intmain(void)

{

inta,b,c,max,mid,min,x;

cout<<"输入一个三位正整数:

";

cin>>x;

a=int(x/100);

b=int((x-a*100)/10);

c=int(x-a*100-b*10);

//分别得出该三位数的每一位上的值,并分别赋给a,b,c

max=a;

if(b>a)max=b;

if(max

//求出三个数的最大值

mid=b;

if(a

if(a

//求出三个数的中间值

min=a;

if(a>b)min=b;

if(c

//求出三个数的最小值

cout<

"<

return0;

}

3、求方程的根

求一元二次方程的根(P51例,P116第15题)

/*求ax2+bx+c=0的根。

a、b、c从键盘输入,a≠0。

分析:

当输入a、b、c的值后,

●若b2-4ac<0,则方程无实根;

●若b2-4ac>0,则方程有两个不同的实根;

●若b2-4ac=O,则方程有两个相等的实根。

#include

●#include

●usingnamespacestd;

●intmain(void)

●{floata,b,c,delta;

●cout<<"输入3个系数:

";

●cin>>a>>b>>c;

●delta=b*b-4*a*c;

●if(delta>=0)//使用复合语句

●{

●delta=sqrt(delta);

●if(delta)

●{cout<<"方程有两个不同的实根:

";

●cout<<"\nx1="<<(-b+delta)/2/a;

●cout<<"\tx2="<<(-b-delta)/2/a<<'\n';

●}

⏹else

●cout<<"方程有两个相等的实根:

x1=x2="<<-b/2/a<<'\n';

●}

●elsecout<<"方程没有实根!

\n";

●return0;

●}

●牛顿迭代法求根(P77第17题

(1))

●/*迭代法求2x^3-4x^2+3x-6=0根*/

●#include

●#include

●usingnamespacestd;

●intmain()

●{

●doublex1,x2,f1,f2;

●x2=1.5;

●do

●{

●x1=x2;

●f1=2*pow(x1,3)-4*pow(x1,2)+3*x1-6;

●f2=6*x1*x1-8*x1+3;

●x2=x1-f1/f2;

●}while(fabs(x2-x1)>1e-8);

●cout<

●return0;

●}

●二分法求根(P77第17题

(2),P116第21题、P197第14题)

●/*二分法求方程的2x^3-4x^2+3x-6=0根*/

●#include

●#include

●#include

●usingnamespacestd;

●intmain()

●{

●doublex1=2,x2=3,x,f1,f2,f;

●do

●{

●x=(x1+x2)/2;

●f1=pow(x1,3)-6*x1-1;

●f2=pow(x2,3)-6*x2-1;

●f=pow(x,3)-6*x-1;

●if(f1*f<0)

●x2=x;

●elseif(f*f2<0)

●x1=x;

●//以下行输出当前算出的几个相关值进行比对,实际做题时可不要此行

●cout<1e-8)<<""<<(f!

=0)<

●}

●while(fabs(x2-x1)>1e-8&&f!

=0);

●cout<

●return0;

●}

●//递归的方式用二分求方程的根

●//方程为:

x^3-6x-1=0

●#include

●#include

●usingnamespacestd;

doublebi_root(doublex1,doublex2,doubleprecision)//假定[x1,x2]区间肯定有解

●{

●doublef1,f2,f,x;

●x=(x1+x2)/2;

●if(fabs(x2-x1)<=precision)returnx;

●f1=x1*x1*x1-6*x1-1;

●f2=x2*x2*x2-6*x2-1;

●f=x*x*x-6*x-1;

●if(f==0)returnx;

●if(f1*f<0)

●returnbi_root(x1,x,precision);

●if(f*f2<0)

●returnbi_root(x,x2,precision);

●}

●voidmain()

●{

●cout<<"指定方程的根:

"<

●}

●/*用二分法设计一个通用函数root(),求方程f(x)=0在[a,b]内的一个实根(设f(a)f(b)<0),要求根的精度为10^-8。

●并调用root()函数求x^3-6x-1=0在x=2附近的一个实根。

*/

●#include

●#include

●usingnamespacestd;

●doubleroot(doublex1,doublex2,double(*f)(double))

●{

●doubley1,y2,x0;

●y1=f(x1);

●y2=f(x2);

●x0=(x1+x2)/2;

●if(y1*y2<0)

●{

●x1=x0;

●}

●if(y1*y2>=0)

●{

●x1=x1*2-x2;

●x2=x0;

●}

●if(fabs(y1)>1e-8||fabs(y2)>1e-8)

●returnroot(x1,x2,f);//递归求解

●else

●returnx0;

●}

●doublefunction(doublex)

●{

●returnpow(x,3)-6*x-1;

●}

●intmain(void)

●{

●doublea,b;

●cout<<"输入a和b:

";

●cin>>a>>b;

●cout<<"x^3-6x-1=0在x=2附近的一个实根为:

"<

●return0;

●}

●弦截法求根(P327第12题)

●/*采用弦截法求一元n次方程f(x)=0在区间[a,b](f(a)与f(b)异号)中的一个实根的算法如下:

(1)取两个不同的点x1和x2若f(x1)和f(x2)异号,则区间(x1,x2)中必有一个实根。

(2)连接(x1,f(x1))和(x2,f(x2))的弦交于x轴的坐标点可用下式求出:

●x=(x1f(x2)-x2f(x1))/(f(x2)-f(x1))

●(3)若f(x)与f(x1)同号,则根必在区间(x,x2),将x作为新的x1;若f(x)与f(x2)同号,则根必在区间(x1,x),将x作为新的x2。

●(4)重复

(2)~(3)步骤,直到|f(x)|<1.0E-6为止。

此时x即为所求的实根。

●根据上述算法,定义求任意给定方程f(x)=0在区间[a,b](f(a)与f(b)异号)的实根的抽象类。

并由此抽象类派生出一个求解方程x^3-5x^2+16x-80=0实根的新类,最终求解方程在[4.5,5.5]间的实根。

*/

●#include

●#include

●usingnamespacestd;

●classroot{

●protected:

●floata,b;//确定区间

●public:

●root(floata,floatb)

●{

●this->a=a;

●this->b=b;

●}

●virtualdoublef(floatx)=0;//纯虚函数,求f(x)的值

●doubleshow();

●};

●doubleroot:

:

show()

●{

●floatx=a;

●while(fabs(f(x))>1E-6)

●{

●x=(a*f(b)-b*f(a))/(f(b)-f(a));

●if(f(x)*f(a)>0)

●a=x;

●if(f(x)*f(b)>0)

●b=x;

●}

●returnx;

●}

●classRoot:

publicroot{

●doublef(floatx)

●{returnpow(x,3)-5*x*x+16*x-80;}

●public:

●Root(floata,floatb):

root(a,b)

●{}

●};

●intmain(void)

●{

●root*a=newRoot(4.5,5.5);

●cout<<"实根为:

"<show()<

●deletea;

●return0;

●}

4、求累和(P57例4.8,4.9,4.10)

//用while语句求1+2+3+…+100的值。

#include

usingnamespacestd;

intmain(void)

{inti=2,//待求和的当前项

s=1;//当前项前所有项的累加和

while(i<=100)//A

{s+=i;i++;}//B

//或:

s+=i++;

//或:

s+=i,i++;

cout<<"1+2+3+…+100="<

return0;

}

//用do…while语句求1+2+…+100。

#include

usingnamespacestd;

intmain(void)

{inti=2,//待求和的当前项

s=1;//当前项前所有项的累加和

do

s+=i++;

while(i<=100);

cout<<"1+2+3+…+100="<

return0;

}

 

#include

usingnamespacestd;

voidmain(void)

{inti=99,//待求和的当前项

s=100;//当前项前所有项的累加和

do

s+=i--;

while(i);

cout<<"1+2+3+…+100="<

}

//用for语句求1+2+…+100。

#include

usingnamespacestd;

intmain(void)

{inti,//待求和的当前项

s;//当前项前所有项的累加和

for(i=2,s=1;i<=100;i++)

s+=i;

cout<<"1+2+3+…+100="<

return0;

}

#include

usingnamespacestd;

voidmain(void)

{inti=2,//待求和的当前项

s=1;//当前项前所有项的累加和

for(;i<=100;i++)//for(;i<=100;)

s+=i;//s+=i++;

cout<<"1+2+3+…+100="<

}

#include

usingnamespacestd;

voidmain(void)

{inti=2,//待求和的当前项

s=1;//当前项前所有项的累加和

for(;;)

{s+=i++;

if(i>100)break;

}

cout<<"1+2+3+…+100="<

}

 

5、计算给定公式的值(P70例4.18,P77第9、11题,P116第16、19题)

//编写程序,利用公式计算π的近似值,直到最后一项的绝对值小于10-8为止。

#include

#include

#include

usingnamespacestd;

intmain()

{

doublepi=0,//π/4的前n项的和,初值为0

t=1,//π/4的当前项的值,初值为1

n=1;//n表示分母

ints=1;//s表示符号

while(fabs(t)>=1E-8)//有效位超过了7位了,要用double型了

{

pi+=t;n+=2;s=-s;

t=-s/n;

}

cout<<"π≈"<

<

return0;

}

//输入一个整数,输入该整数的所有素数因子

#include

#include

usingnamespacestd;

voidmain()

{

intn,i;

cout<<"请输入一个整数:

"<<'\n';

cin>>n;

cout<<"它的所有素数因子为:

";

i=2;

while(n!

=1)

{

while(n%i!

=0)

i++;

cout<

n/=i;

}

求e的近似值

#include

usingnamespacestd;

intmain()

{

doublee=1,n=1,k=1;

do

{

e+=1/k;

n++;

k*=n;

}

while(n<=10);

cout<<"e≈"<

return0;

}

6、判断或求符合条件的特殊数:

●给定条件(P77第12、14题)

●求出1~599中能被3整除,且至少有一位数字为5的所有整数。

●#include

●#include

●usingnamespacestd;

●intmain()

●{

●intn1,n2,n3,k=0;//k用于控制每行输出10个数据

●for(inti=1;i<=599;i++)

●{

●if(i%3)//i%3等价于i%3!

=0

●continue;

●n1=i/100;

●n2=i%100/10;

●n3=i%10;

●if(n1==5||n2==5||n3==5)

●{

●k++;

●cout<

●if(k%10==0)cout<

●}

●}

●return0;

●}

●求满足以下条件3位数n:

它除以11所得到的商等于n的各位数字的平方和,且其中至少两位数字相同。

例如:

131除以11的商为11,各位数字的平方和为11

●#include

●usingnamespacestd;

●intmain()

●{

●intn,n1,n2,n3;

●for(n=100;n<=999;n++)

●{

●n1=n/100;

●n2=n%100/10;

●n3=n%10;

●if(n1==n2||n1==n3||n2==n3)//至少有两位数字相同

●if(n1*n1+n2*n2+n3*n3==n/11)

●cout<

●}

●return0;

●}

●/********************************/

●//以下为用穷举的方法进行的实现//

●/********************************/

●/*

●#include

●usingnamespacestd;

●intmain()

●{

●intn1,n2,n3,i,j;//i为数的百位,j为数的十位,n1,n2,n3为据题设要求构成的数

●for(i=1;i<=9;i++)

●for(j=0;j<=9;j++)

●{

●n1=i*100+j*10+j;//百、十、个至少存在两位相等的情况

●n2=i*100+i*10+j;

●n3=i*100+j*10+i;

●if(i*i+j*j*2==n1/11)

●cout<

●if(i*i*2+j*j==n2/11)

●cout<

●if(i*i*2+j*j==n3/11)

●cout<

●}

●return0;

●}

●*/

完数(P62例4.12)、

输出1000以内所有完数。

“完数”是指与其因子之和相等的数。

例如6=1+2+3,即6是完数。

*/

#include

usingnamespacestd;

intmain(void)

{

inti,//1000以内的一个数

j,//i的试探因子

sum;//i的因子和

for(i=2;i<=1000;i++)//外层for语句

{

for(sum=1,j=2;j<=i/2;j++)//内层for语句

if(i%j==0)sum+=j;

if(sum==i)//i是完数,按指定格式输出

{cout<

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

当前位置:首页 > 求职职场 > 简历

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

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