C++算法汇总Word下载.docx
- 文档编号:19101750
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:61
- 大小:46.97KB
C++算法汇总Word下载.docx
《C++算法汇总Word下载.docx》由会员分享,可在线阅读,更多相关《C++算法汇总Word下载.docx(61页珍藏版)》请在冰豆网上搜索。
●/*编写程序,输入一个三位正整数,输出各位数字组成的最大值。
例如:
输入“123”,输出“321”。
●intmain(void)
●{
●inta,b,c,max,mid,min,x;
输入一个三位正整数:
x;
●a=int(x/100);
●b=int((x-a*100)/10);
●c=int(x-a*100-b*10);
●//分别得出该三位数的每一位上的值,并分别赋给a,b,c
●if(b>
a)max=b;
●//求出三个数的最大值
●mid=b;
●if(a<
b&
&
c<
a)mid=a;
c&
b)mid=c;
●//求出三个数的中间值
●min=a;
b)min=b;
●if(c<
min)min=c;
●//求出三个数的最小值
x<
转换后的形式为:
mid<
min<
●return0;
2、分段函数的计算(P77第3、4题)
/*编写程序,根据输入的x的值,按下列公式计算并输出y的值
当-5<
=x<
=5且x!
=0时y=x-1
当x=0时y=x+1
当5<
=100时y=x+5
当x为其他值时y=100*/
intmain(void)
{
intx,y;
cout<
请输入一个x:
cin>
if(-5<
=x&
x<
=5&
x!
=0)
cout<
y=x-1"
即y等于:
x-1;
elseif(x==0)
y=x+1"
x+1;
elseif(5<
x&
=10)
y=x+5"
x+5;
else
y="
100;
return0;
}
/*编写程序,输入一个三位正整数,输出各位数字组成的最大值。
*/
inta,b,c,max,mid,min,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>
if(max<
//求出三个数的最大值
mid=b;
if(a<
//求出三个数的中间值
min=a;
if(a>
if(c<
//求出三个数的最小值
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<
iostream>
●#include<
cmath>
●usingnamespacestd;
●
●{floata,b,c,delta;
输入3个系数:
●delta=b*b-4*a*c;
●if(delta>
=0)//使用复合语句
●{
●delta=sqrt(delta);
●if(delta)
●{cout<
方程有两个不同的实根:
●cout<
\nx1="
(-b+delta)/2/a;
\tx2="
(-b-delta)/2/a<
●}
⏹else
●cout<
方程有两个相等的实根:
x1=x2="
-b/2/a<
●}
●elsecout<
方程没有实根!
\n"
●牛顿迭代法求根(P77第17题
(1))
●/*迭代法求2x^3-4x^2+3x-6=0根*/
●#include<
●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);
●
x2<
●二分法求根(P77第17题
(2),P116第21题、P197第14题)
●/*二分法求方程的2x^3-4x^2+3x-6=0根*/
iomanip>
●doublex1=2,x2=3,x,f1,f2,f;
●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<
●x1=x;
●//以下行输出当前算出的几个相关值进行比对,实际做题时可不要此行
fixed<
setprecision(8)<
"
(fabs(x2-x1)>
1e-8)<
(f!
=0)<
●while(fabs(x2-x1)>
1e-8&
f!
=0);
●//递归的方式用二分求方程的根
●//方程为:
x^3-6x-1=0
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<
●returnbi_root(x,x2,precision);
●voidmain()
指定方程的根:
bi_root(1,3,1e-8)<
●/*用二分法设计一个通用函数root(),求方程f(x)=0在[a,b]内的一个实根(设f(a)f(b)<
0),要求根的精度为10^-8。
●并调用root()函数求x^3-6x-1=0在x=2附近的一个实根。
*/
●doubleroot(doublex1,doublex2,double(*f)(double))
●doubley1,y2,x0;
●y1=f(x1);
●y2=f(x2);
●x0=(x1+x2)/2;
●if(y1*y2<
●x1=x0;
●if(y1*y2>
●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;
输入a和b:
●cin>
b;
x^3-6x-1=0在x=2附近的一个实根为:
root(a,b,function)<
●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]间的实根。
●classroot{
●protected:
●floata,b;
//确定区间
●public:
●root(floata,floatb)
●this->
a=a;
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)>
●a=x;
●if(f(x)*f(b)>
●b=x;
●returnx;
●classRoot:
publicroot{
●doublef(floatx)
●{returnpow(x,3)-5*x*x+16*x-80;
}
●Root(floata,floatb):
root(a,b)
●{}
●root*a=newRoot(4.5,5.5);
实根为:
a->
show()<
●deletea;
4、求累和(P57例4.8,4.9,4.10)
//用while语句求1+2+3+…+100的值。
#include<
usingnamespacestd;
{inti=2,//待求和的当前项
s=1;
//当前项前所有项的累加和
while(i<
=100)//A
{s+=i;
i++;
}//B
//或:
s+=i++;
//或:
s+=i,i++;
1+2+3+…+100="
s<
//用do…while语句求1+2+…+100。
{inti=2,//待求和的当前项
//当前项前所有项的累加和
do
s+=i++;
=100);
{inti=99,//待求和的当前项
s=100;
s+=i--;
while(i);
//用for语句求1+2+…+100。
{inti,//待求和的当前项
s;
for(i=2,s=1;
i<
=100;
i++)
s+=i;
for(;
i++)//for(;
)
//s+=i++;
{s+=i++;
if(i>
100)break;
5、计算给定公式的值(P70例4.18,P77第9、11题,P116第16、19题)
//编写程序,利用公式计算π的近似值,直到最后一项的绝对值小于10-8为止。
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;
π≈"
fixed
<
pi*4<
//输入一个整数,输入该整数的所有素数因子
#include<
voidmain()
intn,i;
请输入一个整数:
n;
它的所有素数因子为:
i=2;
while(n!
=1)
while(n%i!
=0)
i++;
setw(5)<
i;
n/=i;
求e的近似值
doublee=1,n=1,k=1;
e+=1/k;
n++;
k*=n;
while(n<
=10);
e≈"
e<
6、判断或求符合条件的特殊数:
●给定条件(P77第12、14题)
●求出1~599中能被3整除,且至少有一位数字为5的所有整数。
●intn1,n2,n3,k=0;
//k用于控制每行输出10个数据
●for(inti=1;
=599;
●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<
left<
●if(k%10==0)cout<
//每行打印10个数
●}
●求满足以下条件3位数n:
它除以11所得到的商等于n的各位数字的平方和,且其中至少两位数字相同。
131除以11的商为11,各位数字的平方和为11
●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<
●
●/********************************/
●//以下为用穷举的方法进行的实现//
●/*
●intmain()
●intn1,n2,n3,i,j;
//i为数的百位,j为数的十位,n1,n2,n3为据题设要求构成的数
●for(i=1;
=9;
●for(j=0;
j<
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)
n1<
●if(i*i*2+j*j==n2/11)
n2<
●if(i*i*2+j*j==n3/11)
n3<
●*/
完数(P62例4.12)、
输出1000以内所有完数。
“完数”是指与其因子之和相等的数。
例如6=1+2+3,即6是完数。
inti,//1000以内的一个数
j,//i的试探因子
sum;
//i的因子和
for(i=2;
=1000;
i++)//外层for语句
for(sum=1,j=2;
=i/2;
j++)//内层for语句
if(i%j==0)sum+=j;
if(sum==i)//i是完数,按指定格式输出
{cout<
=1"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 算法 汇总