C++算法汇总.docx
《C++算法汇总.docx》由会员分享,可在线阅读,更多相关《C++算法汇总.docx(61页珍藏版)》请在冰豆网上搜索。
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(5cout<<"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<