C++算法大全.docx

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

C++算法大全.docx

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

C++算法大全.docx

C++算法大全

 

曾经在软通动力写过的算法题其中有一小部分是参考网上的资料,现在拿出来给大家分享!

第3章控制语句

/*1、打印出所有的“水仙花数”。

所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。

例如,153是一水仙花数,因为153=13+53+33。

*/

#include

voidmain()

{

inti,a=0,b=0,c=0;

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

{

a=i%10;

b=i/10%10;

c=i/100%10;

if(a*a*a+b*b*b+c*c*c==i)

cout<<"i="<

}

}

/*2、一个数如果恰好等于它的因子之和,这个数就称为“完数”。

例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。

编程序找出1000之内的所有完数,并按下面的格式输出其因子:

6-〉1,2,3*/

#include

voidmain()

{

inti,j,sum=0,a[50],k,t;

for(i=1;i<=1000;i++)

{

sum=0;

       for(j=1;j

{

if(i%j==0)

{

sum+=j;

a[k++]=j;

}

}

t=k;

if(sum==i)

{

cout<";

for(k=0;k

{

cout<

if(k

}

cout<

}

   k=0;

}

}

/*3、求Sn=a+aa+aaa+…+aa…a之值,其中a是一个数字。

例如:

2+22+222+…+22222(此时n=5),n由键盘输入。

*/

#include

voidmain()

{

doublea,sn=0.0,sum=0.0;

intn,i;

cout<<"pleaseinputanumber";

cin>>a;

   cout<<"pleaseinputnnumber";

cin>>n;

sn=a;

sum=a;

   for(i=2;i<=n;i++)

   {

sum=sum*10+a;

sn+=sum;

   }

cout<<"Sn="<

}

/*4、一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。

求它在第10次落地时,共经过了多少米?

第10次反弹多高?

*/

#include

voidmain()

{

doubleh1=100,h2=100,sum=0.0;

inti;

for(i=1;i<=10;i++)

{

sum+=h2;

h1=h1/2.0;

h2=h1*2;

}

cout<<"sum="<

}

/*5、猴子吃桃问题。

猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。

第二天早上又将剩下的桃子吃掉了一半,又多吃了一个。

以后每天早上都吃了前一天剩下的一半零一个。

到第10天早上想再吃时,见只剩一个桃子了。

求第一天共摘了多少桃子。

*/

#include

voidmain()

{

intnumber,i;

number=1;

for(i=10;i>1;i--)

number=(number+1)*2;

cout<<"number="<

}

8.++程序中使用流格式输入、输出,我们可以怎么做?

答:

在程序的开头包含头文件iostream.h

    cin输入,cout输出。

例如:

#include

voidmain()

{

  inta;

  cout<<"请输入a的值:

";

  cin>>a;

  cout<<"a的值为:

"<

}

第4章函数

/*1、写一函数用“气泡法”对输入的10个字符按由小到大的顺序排列。

*/

#include

voidmain()

{

inti,j,temp,a[10];

cout<<"pleaseinputtennumbers:

\n";

for(i=0;i<10;i++)

cin>>a[i];

for(i=0;i<10;i++)//每循环一次确定数组中一个数的位置

for(j=i+1;j<10;j++)//每次循环对比一个数的大小

{

if(a[i]>a[j])

{

temp=a[j];

a[j]=a[i];

a[i]=temp;

}

}

cout<<"resortresult=";

for(i=0;i<10;i++)

cout<

}

/*2、用递归方法求n阶勒让得多项式的值,递归公式为

        1(n=0)

Pn(x)= x(n=1)

        ((2n-1)*x*Pn-1(x)-(n-1)*Pn-2(x))/n(n>1)*/

#include

doublefun(double,double);

voidmain()

{

doublen,x,sum;

cout<<"inputnandx"<

cin>>n>>x;

sum=fun(n,x);

cout<<"P"<

}

doublefun(doublen1,doublex1)

{

if(n1==0)

return1;

elseif(n1==1)

return x1;

elseif(n1>1)

return((2*n1-1)*x1*fun(n1-1,x1)-(n1-1)*fun(n1-2,x1))/n1;

}

/*3、编写一函数,由实参传来一字符串,统计此字符串中字母、数字、空格、和其它字符的个数,并在主函数中输入字符串以及输出上述结果。

*/

#include

voidjudge(chara[]);

voidmain()

{

constintsize=100;

chara[size];

cin.getline(a,size);

judge(a);

}

voidjudge(chara[100])//判断字符类型

{

intletter=0,number=0,others=0,i=0;

while(a[i]!

='\0')

{

if((a[i]>='a'&&a[i]<='z')||(a[i]>='A'&&a[i]<='z'))letter++;//统计字母个数

elseif(a[i]>='0'&&a[i]<='9')number++;//统计数字个数

elseothers++;//统计其他数个数

i++;

}

cout<<"letter="<

}

/*4、给出年、月、日,计算该日是该年的第几天。

*/

#include

intlead(int);

voidmain()

{

intly,year,month,date,i,sum=0;

cout<<"inputyear、month、date:

";

cin>>year>>month>>date;

inta[12]={31,0,31,30,31,30,31,31,30,31,30,31};

ly=lead(year);

if(ly==1)

a[1]=29;//366天

elsea[1]=28;//365天

for(i=0;i

sum+=a[i];

sum+=date;//加上当前月天数

cout<<"你输入的日期是当年的第"<

}

intlead(inty)//判断闰年

{

if((y%4==0&&y%100!

=0)||(y%400==0))return1;//是闰年

elsereturn0;//不是闰年

}

/*5、写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数由键盘输入。

*/

#include

intcdivisor(int,int);

intcmultiple(int,int,int);

voidmain()

{

intx,y,d,m;

cout<<"inputtwonumber:

";

cin>>x>>y;

d=cdivisor(x,y);

m=cmultiple(x,y,d);

cout<<"commondivisoris"<

}

intcdivisor(intx1,inty1)//最大公约数

{

intr,temp;

if(x1

{

temp=x1;

x1=y1;

y1=temp;

}

while(x1%y1)//当较大数除以较小数余数等于0时,较小数为最大公约数

{

r=x1%y1;

x1=y1;

y1=r;

}

returny1;

}

intcmultiple(intx2,inty2,intd1)//最小公倍数

{

returnx2*y2/d1;//两数相乘结果除以它们的最大公约数为最小公倍数

}

/*6、写一函数,将两个字符串连接。

*/

#include

#include

voidmain()

{

constintsize=100;

chara[size],b[size];

cout<<"inputtwostring:

"<

cin.getline(a,size);

cin.getline(b,size);

strcat(a,b);

cout<<"a="<

}

/*7、写一函数,将一个字符串的元音字母复制到另一个字符串,然后输出。

*/

#include

#include

voidscpy(char*,char*);

voidmain()

{

constintsize=100;

chara[size]="Helloworld";

charb[size]="Net";

cout<<"a="<

scpy(a,b);

cout<<"a="<

}

voidscpy(char*p,char*q)

{

while(*q!

='\0')

{

if(*q=='a'||*q=='A'||*q=='e'||*q=='E'||*q=='i'||*q=='I'||*q=='o'||*q=='O'||*q=='u'||*q=='U')

*p++=*q;

q++;

}

}

/*8、写一函数,输入一个四位数字,要求输出这4个数字字符,但每两个数字间空一空格。

如输入1990,应输出“1990”。

*/

#include

#include

voidouts(chara[]);

voidmain()

{

constintsize=10;

chara[size];

cin.getline(a,size);

outs(a);

}

voidouts(chara[10])

{

inti;

if(strlen(a)<=4)

{

for(i=0;i<4;i++)

cout<

}

elsecout<<"inputerror."<

}

第5章  数组

/*1、将一个数组中的值按逆序重新存放,例如,原来顺序为:

a、b、c、d。

要求改为:

d、c、b、a。

*/

#include

voidback(char*);

voidmain()

{

chara[50]="abcdefg";

cout<<"a="<

back(a);

}

#include

voidback(char*p)

{

inti=0;

while(*p!

='\0')

{

p++;//把指针定位到字符串末尾

i++;//统计字符个数

}

cout<<"a=";

for(;i>0;i--)//逆序输出

{

p--;

cout<<*p;

}

cout<

}

/*2、打印出杨辉三角形(要求打印出前15行)。

(杨辉三角最本质的特征是,它的两条斜边都是由数字1组成的,而其余的数则是等于它肩上的两个数之和。

)*/

#include

voidtri(inta[][15]);

voidmain()

{

inti,j,a[15][15];

tri(a);

cout<<"a=";

for(i=0;i<15;i++)//遍历整个数组

{

for(j=0;j<=i;j++)

{

cout<

if(a[i][j]>=1&&a[i][j]<=9)//当输出个位数之后输出4个空格保持整齐

cout<<"   ";

elseif(a[i][j]>=10&&a[i][j]<=99)//当输出十位数之后输出3个空格保持整齐

cout<<"  ";

elseif(a[i][j]>=100&&a[i][j]<=999)//当输出百位数之后输出2个空格保持整齐

 cout<<" ";

 elsecout<<"";//当输出百位数之后输出1个空格保持整齐

}

cout<

}

}

voidtri(inta[15][15])

{

inti,j;

for(i=0;i<15;i++)

for(j=0;j<=i;j++)

{

if(j==0||j==i)//三角形第一列和对角线被赋值为1

a[i][j]=1;

elsea[i][j]=a[i-1][j-1]+a[i-1][j];//算出其余的数组元素

}

}

/*3、编一程序,将两个字符串连接起来,不要用strcat函数。

*/

#include

#include

voidscat(char*,char*);

voidmain()

{

constintsize=100;

chara[size]="Hello";

charb[size]="Bye";

cout<<"a="<

scat(a,b);

cout<<"a="<

}

voidscat(char*p,char*q)

{

while(*p!

='\0')//确定数组a的插入位置

{

p++;

}

while(*q!

='\0')

{

*p=*q;

p++;

q++;

}

}

/*4、打印“魔方阵”。

所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。

例如:

三阶魔方阵:

     816

     357

     492

要求打印由1到n2的自然数构成的所有魔方阵。

*/

//方法一:

输出N介魔方阵,但每介只输出一种。

#include

voidsquare(inta[][10],intk,intn);

voidmain()

{

intn,i,j,k,a[10][10]={0};

cout<<"inputanoddnumber:

"<

cin>>n;

k=n/2;//确定第一个数列数

square(a,k,n);

for(i=0;i

{

for(j=0;j

cout<<"\t"<

cout<

}

}

voidsquare(inta[][10],intk,intn)

{

inti,j;

for(i=1,j=0;i<=n*n;i++,j--,k++)//n为阶数,从1开始给数组赋值

{

if(j<0&&k>=n)//当数组行列都越出范围时候,确定数组正确位置

{

j+=2;k-=1;

}

elseif(j<0)//当数组行越出范围时候,确定数组正确位置

j+=n;

elseif(k>=n)//当数组列越出范围时候,确定数组正确位置

         k-=n;

 elseif(a[j][k]!

=0)//当数组原位置有数时候,确定数组位置

 {

j+=2;k-=1;

 }

a[j][k]=i;

}

}

//方法二:

输出N介魔方阵所有魔方阵。

#include

#include

#include

usingnamespacestd;

voidprintA(int**p,intn)//输出这个n阶魔方阵

{

cout<

"<

inti,j;

for(i=0;i

{

for(j=0;j

{

cout<

}

cout<

}

cout<

}

boolJudge(int**p,intn)//判断是否为n阶魔方阵

{

inti,j,sum=0,NowSum=0;

boolYesOrNo=true;

for(j=0;j

{

sum+=p[0][j];

}

for(i=1;i

{

NowSum=0;

for(j=0;j

{

NowSum+=p[i][j];

}

if(NowSum!

=sum)

{

YesOrNo=false;

gotoEND;

}

}

for(i=0;i

{

NowSum=0;

for(j=0;j

{

NowSum+=p[j][i];

}

if(NowSum!

=sum)

{

YesOrNo=false;

gotoEND;

}

}

NowSum=0;

for(i=0,j=0;i

{

NowSum+=p[i][j];

}

if(NowSum!

=sum)

{

YesOrNo=false;

gotoEND;

}

NowSum=0;

for(i=n-1,j=0;i>=0,j

{

NowSum+=p[i][j];

}

if(NowSum!

=sum)

{

YesOrNo=false;

gotoEND;

}

END:

returnYesOrNo;

}

voidcombination(int**p,intn,int*a)//求m=n*n个数(1,2,3.....m)的全排列

{

intm=n*n;

staticintNum=0;

int*b_val=newint[m];

intc=0,k,i,j;

b_val[c]=-1;//一维数组首地址的值赋-1c[0]-1

while(b_val[0]

{

if(++b_val[c]

               //b[0]0[1]0[1]1[2]0[2]1[2]2...[6]6...[7]0...[7]7[8]0...[8]8判断魔方[8]9012345678

                     //                                              [7]8[8]0...[8]7判断魔方[8]8[8]9012345687

   //                                [6]7...[7]0...[7]6       [8]8012345768

                                          //      012345786

   //                                                               012345867...

          //    876543210

for(k=0;k

if(b_val[k]==b_val[c])                         

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

当前位置:首页 > 小学教育 > 学科竞赛

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

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