这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战
C++ 基础复习系列——孙不坚1208
C++ 基础复习系列3(递归算法){Fibonacci函数、Hanoi问题}
七、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<<fixed<<setprecision(n)<<; #include < iomanip> 宽度设置函数 setw(n) setw()默认的是输出右对齐,而当你想要左对齐时,便需要另外添加setiosflags(ios::left)来实现输出左对齐。 以特殊符号占位,下面就以补 @为例,用特殊符号占位就需要setfill(‘x’)—这里的’x’指的是字符,代码如下:cout<<setw(6)<<setfill(“@”)<<1234 @@1234 4.判断素数 bool sb(int n) {
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;}