C++ 基础复习系列 05 (题目汇总)

393 阅读4分钟

这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战

C++ 基础复习系列——孙不坚1208

C++ 基础复习系列01(输入输出类、调用数学函数类)

C++ 基础复习系列2(打印图形类(循环)、经典问题类)

C++ 基础复习系列3(递归算法){Fibonacci函数、Hanoi问题}

C++ 基础复习系列4(零散资料总结)

C++ 基础复习系列5(题目汇总)

七、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;}