C++编程题目算法大全
第3章 控制语句
/* 1、打印出所有的“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如,153是一水仙花数,因为153 = 13 + 53 + 33。 */
#include void main() { int i, 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 void main() { int i,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 void main() { double a,sn=0.0,sum=0.0; int n,i; cout<<\"please input a number\"; cin>>a; cout<<\"please input n number\"; 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 void main() { double h1=100,h2=100,sum=0.0; int i; for(i=1;i<=10;i++) { sum+=h2; h1=h1/2.0; h2=h1*2; } cout<<\"sum=\"< /* 5、猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉了一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩一个桃子了。求第一天共摘了多少桃子。*/ #include void main() { int number,i; number=1; for(i=10;i>1;i--) number=(number+1)*2; cout<<\"number=\"< 8.++程序中使用流格式输入、输出,我们可以怎么做? 答:在程序的开头包含头文件iostream.h cin输入,cout输出。 例如: #include void main() { int a; cout<<\"请输入a的值:\"; cin>>a; cout<<\"a的值为:\"<} 第4章 函数 /* 1、写一函数用“气泡法”对输入的10个字符按由小到大的顺序排列。*/ #include void main() { int i,j,temp,a[10]; cout<<\"please input ten numbers:\\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<<\"resort result=\"; 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 double fun (double,double); void main() { double n,x,sum; cout<<\"input n and x\"< sum=fun(n,x); cout<<\"P\"< double fun(double n1,double x1) { if (n1==0) return 1; else if (n1==1) return x1; else if (n1>1) return ((2*n1-1)*x1*fun(n1-1,x1)-(n1-1)*fun(n1-2,x1))/n1; } /* 3、编写一函数,由实参传来一字符串,统计此字符串中字母、数字、空格、和其它字符的个数,并在主函数中输入字符串以及输出上述结果。 */ #include void judge(char a[]); void main() { const int size=100; char a[size]; cin.getline(a,size); judge(a); } void judge(char a[100])//判断字符类型 { int letter=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++;//统计字母个数 else if (a[i]>='0' && a[i]<='9') number++;//统计数字个数 else others++;//统计其他数个数 i++; } cout<<\"letter=\"< /* 4、给出年、月、日,计算该日是该年的第几天。 */ #include int lead(int); void main() { int ly,year,month,date,i,sum=0; cout<<\"input year、month、date: \"; cin>>year>>month>>date; int a[12]={31,0,31,30,31,30,31,31,30,31,30,31}; ly=lead(year); if (ly==1) a[1]=29;//366天 else a[1]=28;//365天 for(i=0;i sum+=date; //加上当前月天数 cout<<\"你输入的日期是当年的第\"< int lead(int y)//判断闰年 { if((y%4==0&&y%100!=0)||(y%400==0)) return 1;//是闰年 else return 0;//不是闰年 } /* 5、写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数由键盘输入。 */ #include int cdivisor(int,int); int cmultiple(int,int,int); void main() { int x,y,d,m; cout<<\"input two number: \"; cin>>x>>y; d=cdivisor(x,y); m=cmultiple(x,y,d); cout<<\"common divisor is \"< int cdivisor(int x1,int y1)//最大公约数 is \"< int r,temp; if (x1 temp=x1; x1=y1; y1=temp; } while(x1%y1)//当较大数除以较小数余数等于0时,较小数为最大公约数 { r=x1%y1; x1=y1; y1=r; } return y1; } int cmultiple(int x2,int y2,int d1)//最小公倍数 { return x2*y2/d1;//两数相乘结果除以它们的最大公约数为最小公倍数 } /* 6、写一函数,将两个字符串连接。 */ #include #include void main() { const int size=100; char a[size],b[size]; cout<<\"input two string:\"< cin.getline(b,size); strcat(a,b); cout<<\"a=\"<} /* 7、写一函数,将一个字符串的元音字母复制到另一个字符串,然后输出。#include #include void scpy(char *,char *); void main() { */ const int size=100; char a[size]=\"Hello world\"; char b[size]=\"Net\"; cout<<\"a= \"<scpy(a,b); cout<<\"a= \"<} void scpy(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,应输出“1 9 9 0”。 */ #include #include void outs(char a[]); void main() { const int size=10; char a[size]; cin.getline(a,size); outs(a); } void outs(char a[10]) { int i; if(strlen(a)<=4) { for(i=0;i<4;i++) cout<} else cout<<\"input error.\"< 第5章 数组 /* 1、将一个数组中的值按逆序重新存放,例如,原来顺序为:a、b、c、d。要求改为:d、c、b、a。 */ #include void back(char *); void main() { char a[50]=\"abcdefg\"; cout<<\"a=\"<back(a); } #include void back(char *p) { int i=0; while(*p!='\\0') { p++;//把指针定位到字符串末尾 i++;//统计字符个数 } cout<<\"a=\"; for(;i>0;i--)//逆序输出 { p--; cout<<*p; } cout< /* 2、打印出杨辉三角形(要求打印出前15行)。(杨辉三角最本质的特征是,它的两条斜边都是由数字1组成的,而其余的数则是等于它肩上的两个数之和。) */ #include void tri(int a[][15]); void main() { int i,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<<\" \"; else if (a[i][j]>=10&&a[i][j]<=99)//当输出十位数之后输出3个空格保持整齐 cout<<\" \"; else if(a[i][j]>=100&&a[i][j]<=999)//当输出百位数之后输出2个空格保持整齐 cout<<\" \"; else cout<<\" \";//当输出百位数之后输出1个空格保持整齐 } cout< } void tri(int a[15][15]) { int i,j; for(i=0;i<15;i++) for(j=0;j<=i;j++) { if(j==0||j==i)//三角形第一列和对角线被赋值为1 a[i][j]=1; else a[i][j]=a[i-1][j-1]+a[i-1][j];//算出其余的数组元素 } } /* 3、编一程序,将两个字符串连接起来,不要用strcat函数。#include #include void scat(char *,char *); */ void main() { const int size=100; char a[size]=\"Hello\"; char b[size]=\"Bye\"; cout<<\"a=\"<scat(a,b); cout<<\"a=\"<} void scat(char *p,char *q) { while(*p!='\\0')//确定数组a的插入位置 { p++; } while(*q!='\\0') { *p=*q; p++; q++; } } /* 4、打印“魔方阵”。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如:三阶魔方阵: 8 1 6 3 5 7 4 9 2 要求打印由1到n2的自然数构成的所有魔方阵。 */ //方法一:输出N介魔方阵,但每介只输出一种。 #include void square(int a[][10],int k,int n); void main() { int n,i,j,k,a[10][10]={0}; cout<<\"input an odd number:\"< k=n/2;//确定第一个数列数 square(a,k,n); for(i=0;i for(j=0;j } void square(int a[][10],int k,int n) { int i,j; for(i=1,j=0;i<=n*n;i++,j--,k++)//n为阶数,从1开始给数组赋值 { if(j<0&&k>=n)//当数组行列都越出范围时候,确定数组正确位置 { j+=2;k-=1; } else if(j<0)//当数组行越出范围时候,确定数组正确位置 j+=n; else if(k>=n)//当数组列越出范围时候,确定数组正确位置 k-=n; else if(a[j][k]!=0)//当数组原位置有数时候,确定数组位置 { j+=2;k-=1; } a[j][k]=i; } } //方法二:输出N介魔方阵所有魔方阵。 #include #include #include using namespace std; void printA(int **p,int n)//输出这个n阶魔方阵 { cout< for(i = 0;i < n;i++) { for(j = 0;j < n;j++) { cout< cout< cout< bool Judge(int **p,int n)//判断是否为n阶魔方阵 { int i,j,sum = 0,NowSum = 0; bool YesOrNo = true; for(j = 0;j < n;j++)//第一行总和 { sum += p[0][j]; } for(i = 1;i < n;i++)//判断每行总和是否相等 { NowSum = 0; for(j = 0;j < n;j++) { NowSum += p[i][j]; } if(NowSum != sum) { YesOrNo = false; goto END; } } for(i = 0;i < n;i++)//每列是否相等 { NowSum = 0; for(j = 0;j < n;j++) { NowSum += p[j][i]; } if(NowSum != sum) { YesOrNo = false; goto END; } } NowSum = 0; for(i = 0,j = 0;i < n,j < n;i++,j++)//主对角线是否相等 { NowSum += p[i][j]; } if(NowSum != sum) { YesOrNo = false; goto END; } NowSum = 0; for(i = n-1,j = 0;i >= 0,j < n;i--,j++)//次对角线是否相等 { NowSum += p[i][j]; } if(NowSum != sum) { YesOrNo = false; goto END; } END: return YesOrNo; } void combination(int **p,int n,int *a)//求m = n*n个数(1,2,3.....m)的全排列 { int m = n*n; static int Num = 0; int *b_val = new int[m]; int c = 0,k,i,j; b_val[c] = -1;//一维数组首地址的值赋-1 c[0]-1 while(b_val[0] < m) //-1 { if(++b_val[c] < m) //分别从0开始累加每个元素值,并限制不超出最大阶数 //b[0]0 [1]0 [1]1 [2]0 [2]1 [2]2...[6]6...[7]0...[7]7 [8]0...[8]8 判断魔方 [8]9 012345678 // [7]8 [8]0...[8]7 判断魔方 [8]8 [8]9 012345687 // [6]7...[7]0...[7]6 [8]8 012345768 // 012345786 // 012345867 ... // 876543210 { for(k = 0;k < c;k++) //是否与前面数字重复,如有重复元素跳出,否则使K下标等于C下标 if(b_val[k] == b_val[c]) break; if(k == c)//如果没有重复元素,就可以确定当前元素值,并继续排列下一个下标的数组元素 { if(c+1 < m) //1 2 3...7 8 如果不满足条件,则生成了一组排列方式,否则继续排列下一个元素 // 8 { ++c; //1 2 3...7 8 // 8 b_val[c] = -1; // continue; } else //生成了一组排列方式 { k = -1; for(i = 0;i < n;i++) { for(j = 0;j < n;j++) { p[i][j] = a[b_val[++k]];//a[0]-a[8] } } //判断是否为n阶魔方阵 if(Judge(p,n)) { printA(p,n); } } } } else { c--; } } delete []b_val; } void evaluate(int **p,int n)//给n阶方阵的元素赋值 { int i; int *AllNum = new int[3*3]; for(i = 1;i <= n*n;i++) { AllNum[i - 1] = i; } combination(p,n,AllNum); delete []AllNum; } void main() { int i,n,**a; string s; do { //输入n阶方阵的阶数n cout<<\"请输入n阶方阵的阶数n(退出程序按e或E键):\"; cin>>s; if(!strcmp(s.c_str(),\"e\") || !strcmp(s.c_str(),\"E\")) { break; } else if(s.find_first_not_of(\"0123456789\") != string::npos) { cout<<\"请输入有效的数字,不能含有非数字的字符。\"< } else { n = atoi(s.c_str()); if(n < 1) { cout<<\"请输入有效的数字,必须 >= 1。continue; } \"< for(i = 0; i < n; i++) { a[i] = new int[n]; } cout<<\"正在运算,请等待。。。。。。//给n阶方阵的元素赋值 evaluate(a,n); cout<<\"运算结束!\"< { delete []a[i]; \"< delete []a; } }while(1); return; } /* 5、求一个3x3矩阵对角线元素之和。*/ #include int dia(int a[][3]); void main() { int i,j,sum,a[3][3]={2,3,5,6,2,3,1,9,0}; cout<<\"a= \"; for(i=0;i<3;i++) { for(j=0;j<3;j++) cout<cout< sum=dia(a); cout<<\"\\nsum=\"< int dia(int a[3][3]) { int i,j,sum=0; for(i=0;i<3;i++)//主对角线之和 for(j=i;j<=i;j++) sum+=a[i][j]; for(j=0;j<3;j++)//另一个对角线之和 for(i=2-j;i<=2-j;i++) if(i!=j)//避免重复累加两个对焦向重合的元素 sum+=a[i][j]; return sum;//返回对角线员素之和 } /* 6、编写一个程序,将字符数组s2中的全部字符拷贝到字符数组s1中。不用strcpy函数。拷贝时,‘\\0’也要拷贝过去。 ‘\\0’后面的字符不拷贝。*/ #include void scopy(char a[],char b[]); void main() { int i; char a[10]; char b[10]=\"Hello\"; scopy(a,b); for(i=0;a[i]!='\\0';i++) cout<cout< void scopy(char a[],char b[]) { int i; for(i=0;b[i]!='\\0';i++) { a[i]=b[i]; } a[i]='\\0'; } /* 7、用筛选法求100之内的素数。(所谓素数就是除了1和它本身以外,不能再被别的整数整除,这种数称作素数(也称质数)。)*/ #include void main() { int i,j; for(i=1;i<=100;i++) { for(j=2;jif(i%j!=0); else break;//不是素数 if(i==j)//相等为素数 cout<<\" \"<} cout< /* 8、用选择法对10个整数排序。*/ #include void csort(int a[10]); void main() { int i; int a[10]={6,4,2,7,9,0,1,6,3,0}; for(i=0;i<10;i++)//输出原数组数据顺序 cout<cout< for(i=0;i<10;i++)//输出排序后的顺序 cout<cout< void csort(int a[10])//排序 { int i,j,k,temp=0; for(i=1;i<10;i++) { k=i; for(j=k+1;j<10;j++)//找出最小数的数组下标 if(a[k]>a[j])k=j; if(k!=i) { temp=a[i];//把数放到正确位置 a[i]=a[k]; a[k]=temp; } } } 第6章 指针 /* 1、在主函数中输入10个字符串。用另一函数对它们排序。然后在主函数输出这10个已排好序的字符串。(用指针实现)*/ #include void psort(int *p); void main() { int i,a[10]; cout<<\"please input ten numbers:\\n\"; for(i=0;i<10;i++) cin>>a[i]; psort(a); cout<<\"resort result=\"; for(i=0;i<10;i++) cout<} void psort(int *p) { int i,j,temp; for(i=0;i<10;i++) //每循环一次确定数组中一个数的位置 for(j=i+1;j<10;j++) //每次循环对比一个数的大小 { if(p[i]>p[j]) { temp=p[j]; p[j]=p[i]; p[i]=temp; } } } /* 2、输入一个字符串,内有数字和非数字字符,如A123x456 1233?8997jhlkll 将其中连续的数字作为一个整数,依次存放到一数组a中,统计共有多少个整数,并输出这些数。*/ #include #include #include int charge(int *,char *); void main() { int a[50],i,numb; char b[50]; cout<<\"please input a character string:\"< system(\"cls\"); cout<<\"your character string is \"; cout.write(b,strlen(b))< for(i=0;i int charge(int *q,char *p)//*q指向新数组,*p指向初始数组 { int numb=0; for(;*p!='\\0';p++)//判断每个字符 { if(*p>='0'&&*p<='9') { *q=(*p)-'0';//将字符型整数转换成整型整数赋值给新数组 p++; while(*p>='0'&&*p<='9')//判断是否有连续字符型整数 { *q=(*q)*10+((*p)-'0');//将连续字符型整数转换成一个整型整数赋值给新数组 p++; } q++; numb++;//统计整数的个数 } } return numb; } /* 3、用指向指针的指针的方法对5个字符串排序并输出。*/ #include #include void sort(char **str); void main() { int i; char *string[5]; cout<<\"输入5个字符串:\"< { string[i] = new char[10]; cin.getline(*(string+i),50); } sort(string); for(i=0;i<5;i++) delete [] string[i]; } void sort(char **str) { int i=0,j; char *p=0; for(i=0;i<4;i++) { for(j=i+1;j<5;j++) { if(strcmp(*(str+i),*(str+j))<0) { p=*(str+i); *(str+i)=*(str+j); *(str+j)=p; } } } cout<<\"after sort the chars :\"< { cout<<*(str+i)< } /* 4、统计一字符串在另一个字符串中出现的次数。*/ #include #include int change(char *,char *); void main() { int sum; char a[10]=\"dog\"; char b[20]=\"sdlkdogsddydodog\"; cout.write(a,10)< cout<<\"sum=\"< int change(char *p,char *q) { int sum=0,i=0; while(*q!='\\0') { while(*p==*q&&*p!='\\0')//对比是否含有相等字符串 { *p++; *q++; i++; } if(*p=='\\0') { sum+=1;//含有字符串个数 } p=p-i;//第一个字符串重新定位 q=q-i;//第二个字符串重新定位 i=0;//重新累加移动次数 q++; } return sum; } /* 5、有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数.n和m从键盘输入。*/ #include #include void charge(int a[],int,int); void main() { int i,n,m,a[50]; cout<<\"请输入n的值:\"; cin>>n; cout<<\"请输入移动位数:\"; cin>>m; cout<<\"请输入整数:\"; for(i=0;i cin>>a[i]; } cout<<\"您输入的整数为:\"; for(i=0;i cout<} cout< cout<<\"移动后的整数为:\"; for(i=0;i cout<} cout< void charge(int a[],int n, int m)//n为整数个数,向右移动m个位置 { int i,j; for(j=0;j for(i=n-1;i>=0;i--)//移动一个位置就要移动每一个数组元素 { a[i+1]=a[i]; } a[0]=a[n]; } } /* 6、有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。*/ #include void change(int a[],int n); void main() { int i,a[50],n; cout<<\"输入人数:\"; cin>>n; for(i=0;i change(a,n); } void change(int a[],int n) { int qnumber=0,i=0,k=0; while(n-qnumber>1)//直到只剩下1人时 { if(a[i]!=0)k++; //报数 if(k==3) { a[i]=0; //退出圈子的人 qnumber++; //退出的总人数 k=0; //重新开始报数 } i++; if(i==n)i=0; //当所有人都报过数之后重新每人再次报数 }