七、c++例题
冒泡排序
for(int i=0;i<n-1;i++) { for (int j=0;j<n-1-i;j++) { if(a[j]<a[j+1]) a[j]^=a[j+1]^=a[j]^=a[j+1]; //相邻元素比较交换 } }
sort
头文件 #include < algorithm > sort函数若没有第三个参数,默认实现的是从小到大 less<数据类型>() //从小到大排序 greater<数据类型>() //从大到小排序 利用sort函数实现对字符的排序 #include<iostream> #include<algorithm> using namespace std; int main(){ char a[11]="asdfghjklk"; for(int i=0;i<10;i++) cout<<a[i]<<endl; sort(a,a+10,greater<char>()); for(int i=0;i<10;i++) cout<<a[i]<<endl; return 0; }
10转16进制
#include<iostream>using namespace std; char exchange(int n){ switch(n){ case 0: return '0';break; case 1: return '1';break; case 2: return '2';break; case 3: return '3';break; case 4: return '4';break; case 5: return '5';break; case 6: return '6';break; case 7: return '7';break; case 8: return '8';break; case 9: return '9';break; case 10: return 'A';break; case 11:return 'B';break; case 12:return 'C';break; case 13:return 'D';break; case 14: return 'E';break; case 15:return 'F';break;}} int main(){ int m,note,i=0,s=0; cin>>m; note=m; while(m/16!=0){ i++; m=m/16; } char a[i]; while(note/16!=0){ a[s]=exchange(note%16); s++; note=note/16; } a[i]=exchange(note); for(int j=i;j>=0;j--){ cout<<a[j]; } cout<<endl; return 0; }
原封不动输出:当成字符串 string
#include < iomanip> 要保留n位小数: cout< 宽度设置函数 setw(n) setw()默认的是输出右对齐,而当你想要左对齐时,便需要另外添加setiosflags(ios::left)来实现输出左对齐。 以特殊符号占位,下面就以补 @为例,用特殊符号占位就需要setfill(‘x’)—这里的’x’指的是字符,代码如下:
cout< int i; for(i = 2; i <= sqrt(n); i++) { if((n % i) == 0) return false; } return true; }
任意整数拿到各个数位的值
#include <iostream> using namespace std; void sb(int n){ if(n>9){ sb(n/10); //每次调用时将输入的数最后一位去掉 cout<<n%10<<" "; //每次调用都打印出第一位 }else cout<<n<<" ";//直接打印小于10的所有数 } int main(){ int n=0; cin>>n; sb(n); cout<<endl; return 0; }
闰年判断问题闰年:能被4整除但不能被100整除,或可以被400整除 if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0)阶乘
long Fac(int n){ if (n == 0) return 1; else return n * Fac(n - 1); }
输出0~255的二进制数
#include <iostream> #include <bitset> using namespace std; int main(){ bitset<8>b; for(int i = 0; i < 256; i++){ b = i; cout<<b<<endl; } return 0; }
递归解法
斐波那契数列 int f(int n){ // 1.先写递归结束条件 if(n <= 2){ return 1; } // 2.接着写等价关系式 return f(n-1) + f(n - 2); }
汉诺塔问题
#include <iostream> using namespace std; long count = 0;//记录移动的次数 void hanoi(int n,char a,char b,char c) { //n个盘子,a移动到c,用b做临时塔 if (1 == n){ cout<<"第"<<++count<<"次: "<<a<<"塔--->"<<c<<"塔"<<endl; }else{ hanoi(n-1,a,c,b);//递归调用,a移到b,c做临时塔 cout<<"第"<<++count<<"次: "<<a<<"塔--->"<<c<<"塔"<<endl; hanoi(n-1,b,a,c); } } int main(){ int n; cout<<"输入汉诺塔圆盘的数量: "; cin>>n; hanoi(n,'A','B','C'); return 0; }
分鱼问题
#include<iostream> using namespace std; int fish(int n, int x){ if((x-1)%5 == 0){ if(n == 1) return 1; else return fish(n-1, (x-1)/5*4); } return 0; //x不是符合题意的解,返回0 } int main(){ int i=0, flag=0, x; do{ i=i+1; x=i*5+1; //x最小值为6,以后每次增加5 if(fish(5, x)){ //将x传入分鱼递归函数进行检验 flag=1; //找到第一个符合题意的x则置标志位为1 cout<<"五个人合伙捕到的鱼总数为"<<x; } } while(!flag); //未找到符合题意的x,继续循环,否则退出循环 return 0; }
描述:输入两个正整数,a和b,求出a/b的结果中小数点后的20位。输入:两个正整数,a和b输出:注意行尾输出回车、注意最后一位数字四舍五入。
#include <iostream> #include <cmath> using namespace std; int main(){ int a, b, i; cin >> a >> b; a = a % b; for(i = 0; i < 19; i ++){ a = a * 10; cout << a / b; a = a - a / b * b; } a = a * 10; i = a / b; a = a - a / b * b; a = a * 10; if(a > 4) cout << (i + 1) << endl; else cout << i << endl; return 0; }
请定义一个结构体以描述学生信息,包括姓名、学号、年龄、性别、 手机号码,其中年龄为 int 型值,性别为 char 型值,其余成员均为长 度小于 20 的字符串(不含空格)。 输入 n(n < 20)及 n 个学生的信息,再输入待查找学生的手机号, 如果找到该学生,输出其信息,各项间用制表符分隔,否则输出 Not Found。
#include <iostream> #include <string.h> using namespace std; struct student{ char name[27]; char no[27]; int age; char gender; char phone[27]; }; int main(){ student a[27]; int n,i; char phone[27]; cin>>n; for(i = 0; i < n; i ++) cin >> a[i].name >> a[i].no >> a[i].age >> a[i].gender >> a[i].phone; cin >> phone; for(i = 0; i < n; i ++) if(!strcmp(a[i].phone, phone)) { cout << a[i].name << "\t" << a[i].no << "\t" << a[i].age << "\t" << a[i].gender << "\t"<< a[i].phone << endl; return 0; } cout << "Not Found" << endl; }
请定义一个结构体以描述学生信息,包括姓名、学号、年龄、性别、 手机号码,其中年龄为 int 值,性别为 char 值,其余成员均为长度小 于 20 的字符串(不含空格)。 输入 n(n < 20)及 n 个学生的信息,输出按年龄降序排列后的学 生信息,年龄相等的话,按姓名升序输出。
#include <iostream> #include <string.h> #include <algorithm> using namespace std; struct student{ char name[27]; char no[27]; int age; char gender; char phone[27]; }a[27]; bool cmp(student a, student b) { if(a.age == b.age){ if(strcmp(a.name, b.name) < 0) return true; else return false; } return a.age > b.age; } int main(){ int n, i; cin >> n; for(i = 0; i < n; i ++) { cin >> a[i].name >> a[i].no >> a[i].age >> a[i].gender >> a[i].phone; } sort(a, a + n, cmp); for(i = 0; i < n; i ++) { cout << a[i].name << "\t" << a[i].no << "\t" << a[i].age << "\t" << a[i].gender << "\t" << a[i].phone << endl; } return 0; }
输入今天的年月日,输出昨天的日期。
#include <iostream> #include <cmath> using namespace std; int day[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; bool f(int a) { if(a % 4 == 0 && a % 100 != 0 || a % 400 == 0) return true; return false; } int main(){ int y, m, d; 6 cin >> y >> m >> d; if(d == 1){ if(m == 1) cout << y-1 << " 12 31" << endl; else if(m == 3){ if(f(y)) cout << y << " 2 29" << endl; else cout << y << " 2 28" << endl; } else cout << y << " " << m - 1 << " " << day[m-1] << endl; } else cout << y << " " << m << " " << d - 1 << endl; return 0; }
给出相邻两个素数a、b的差值c,请输出a b,其中保证a、b为所有可能的解中最小的。例如,如果输入的c值为2,则应输出3 5回车,而不是5 7回车。注意行尾输出回车。c值小于100,且题目保证一定有解
#include <iostream> using namespace std; bool p(int a) { for(int i=2;i<a;i++) { if(a%i==0) return false; } return true; } int main() { int c,x=0; cin>>c; int a=2,b=3; for(int i = a;;i ++) { if(a - b == c) { cout << b << " " << a << endl; return 0; } if(p(i)) { b = a; a = i; } } return 0; }
编写程序,计算一个字符串中出现频率最高的字母字符。如果有两个以上的字母出现的次数相同,且同为最高频率,输出字典序小的字母。注意,大写字母的ASCII值小于小写字母。
#include <stdio.h>#include <string.h>#include <iostream> #include <iomanip>#include <cmath>#include <string.h> using namespace std; bool f(char a) { if(a >= 'a' && a <= 'z') return true; return false; } bool g(char a) { if(a >= 'A' && a <= 'Z') return true; return false; } int main() { char a[1007]; int i, b[52] = {0}, max = -1; cin.get(a, 1007); for(i = 0; a[i]; i ++) { if(f(a[i])) { b[a[i] - 'a' + 26] ++; } else if(g(a[i])) { b[a[i] - 'A'] ++; } } for(i = 0; i < 52; i ++) { if(b[i] > max) max = b[i]; } for(i = 0; i < 52; i ++){ if(b[i] == max) { if(i < 26) { cout << (char)('A' + i) << endl; break; } else { cout << (char)('a' + i - 26) << endl; break; } } } return 0; }
编写程序,计算一个字符串中出现频率最高的字母字符。如果有两个以上的字母出现的次数相同,且同为最高频率,输出在原字符串中最先出现的字母。
#include <stdio.h>#include <string.h>#include <iostream> #include <iomanip>#include <cmath>#include <string.h> using namespace std; bool f(char a) { if(a >= 'a' && a <= 'z') return true; return false; }bool g(char a) { if(a >= 'A' && a <= 'Z') return true; return false; } int main() { char a[1007]; int i, b[52] = {0}, max = -1; cin.get(a, 1007); for(i = 0; a[i]; i ++) { if(f(a[i])) { b[a[i] - 'a' + 26] ++;} else if(g(a[i])) {b[a[i] - 'A'] ++;} } for(i = 0; i < 52; i ++) { if(b[i] > max) max = b[i]; } for(i = 0; a[i]; i ++) { if(f(a[i]) && b[a[i] - 'a' + 26] == max) { cout << a[i] << endl; break; } else if(g(a[i]) && b[a[i] - 'A'] == max) { cout << a[i] << endl; break; }} return 0;}