C++期末作业复习题库


1.除以13

描述

输入一个大于0的大整数N,长度不超过100位,要求输出其除以13得到的商和余数。

输入
一个大于0的大整数,长度不超过100位。
输出
两行,分别为整数除法得到的商和余数。

样例输入:

2132104848488485

样例输出:

164008065268345
0

#include <iostream>
#include<cstdio>
#include<cstring>

using namespace std;

int main()
{
    int t,len,shang[300],yu=0,b[150]={0};    //yu表示余数,shang[300]表示商
    char a[150];
    gets(a+1);     //从标准输入设备读取字符串函数
    len=strlen(a+1);     //获取字符串长度
    for(int i=1;i<=len;i++)
    {
        b[i]=a[i]-48; //ascll表中0-9是在48-57,所以需要重零开始
        b[i]=b[i]+yu*10; 
        yu=b[i]%13;        //得到余数
        shang[i]=b[i]/13;  //得到商
    }
    for(int j=1;j<=len;j++)   //用于删除前导0
    {
        if(shang[j]!=0)
        {
           t=j;
            break;
        }
    }

    for(t;t<=len;t++)    //此时t=j
    {
        cout<<shang[t];
    }
    cout<<endl;
    cout << yu<< endl;
    return 0;
}

2.判决素数个数

描述

输入两个整数X和Y,输出两者之间的素数个数(包括X和Y)。
输入
两个整数X和Y(1 <= X,Y <= 105)。
输出
输出一个整数,表示X,Y之间的素数个数(包括X和Y)。
样例输入:

1 100

样例输出:

25

#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
bool isprime(int n)
{
    if(n < 2) return false;
    if(n == 2) return true;
    for(int i = 2; i <= sqrt(n); ++i) 
    {
        if(n % i == 0) return false;
    }
    return true;
}
 
int main()
{
    int x, y, sum = 0;
    scanf("%d%d",&x,&y);
    if(x>y) swap(x,y);//如果x>y,则需要交换 
    for(int i = x; i <= y; ++i)  //循环出全部数,判断某个数是素数。
    {
        if(isprime(i)) sum++;
    }
    printf("%d",sum);
    return 0;
} 

3.人民币支付

描述

从键盘输入一指定金额(以元为单位,如345),然后输出支付该金额的各种面额的人民币数量,显示100元,50元,20元,10元,5元,1元各多少张,要求尽量使用大面额的钞票。
输入
一个小于1000的正整数。
输出
输出分行,每行显示一个整数,从上到下分别表示100元,50元,20元,10元,5元,1元人民币的张数
样例输入

735

样例输出

7
0
1
1
1
0


#include <iostream>

using namespace std;

//计算返回位数 
int juge(int n){
    int count=0;
    while(n){
        n/=10;
        count++;
    }
    return count;
}

int main(){
    int n,a=0,b=0,c=0,d=0,e=0; //定义输入的变量,以及每张人民币的面值为代表: a:100 b:50 c:20…… 
    cin >> n;   //例如 396
    while(n>5){ //如果输入金额大于5,那么进入循环,判断其位数,再从大往小递减 
        if(juge(n) == 3){ //这里的3表示3个零,  例如:n=96  a=3
            a=n/100;
            n=n%100;
        }
        if(juge(n) == 2){ //同上 例如:n=96 
            if(n >= 50){       
                n=n-50;
                b++;
            }
            while(n>=20){  //例如:( n=46  a=3 b=1 c=0),(n=26 a=3 b=1 c=1),(n=6 a=3 b=1 c=2)
                n=n-20;
                c++;
            }
            if(n>=10){   //例如:(n=6 a=3 b=1 c=2 d=0)
                n=n-10;
                d++;
            }
        }  
        if(n >= 5){  //例如:(n=6 a=3 b=1 c=2 d=0),//(n=1 a=3 b=1 c=2 d=0 e=1)
            n=n-5;
            e++;
        }
    }
    cout<<a<<endl;
    cout<<b<<endl;
    cout<<c<<endl;
    cout<<d<<endl;
    cout<<e<<endl;
    cout<<n<<endl;
}


4.最长单词

描述

一个以'.'结尾的简单英文句子,单词之间用空格分隔,没有缩写形式和其它特殊形式
输入
一个以'.'结尾的简单英文句子(长度不超过500),单词之间用空格分隔,没有缩写形式和其它特殊形式
输出
该句子中最长的单词。如果多于一个,则输出第一个
样例输入

I am a student of Peking University.

样例输出

University

#include <iostream>
#include <cstring>
#include <cstdio> 
using namespace std;
int main()
{
    char a[2500];   //题目说明不超过500但是试了501-510运行都显示错误  不清楚为什么 给大点就完事 有人知道原因希望告知评论下
    gets(a);    
    int len=strlen(a);
    int k=0,max=-1,max_x;
    for(int i=0;i<len;i++)  //遍历 
    {
        if( (a[i] >= 'a' && a[i]<='z') || (a[i] >= 'A' && a[i] <='Z'))  //若为大小字母则 计数器 k++ 
        {
            k++;
        }
        else        //若为 空格与点则 
        {
            if(k>max)   //判断最大长度 
            {
                max=k;  //记录最大长度存入max中 
                max_x=i-max;    //记录最大单词的起始坐标 
            }
            k=0;    //计数器清零 
        }
    } 
    for(int i=max_x;i<max_x+max;i++)    //输出起点 为 max_x 长度为max的单词 
    cout<<a[i];
}

5.Tomorrow never knows?

描述

甲壳虫的《A day in the life》和《Tomorrow never knows》脍炙人口,如果告诉你a day in the life,真的会是tomorrow never knows?相信学了计概之后这个不会是难题,现在就来实现吧。 读入一个格式为yyyy-mm-dd的日期(即年-月-日),输出这个日期下一天的日期。可以假定输入的日期不早于1600-01-01,也不晚于2999-12-30。
输入
输入仅一行,格式为yyyy-mm-dd的日期。
输出
输出也仅一行,格式为yyyy-mm-dd的日期
样例输入

2010-07-05

样例输出

2010-07-06

提示
闰年的标准:
(1)普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年)
地球公转示意图
(2)世纪年能被400整除的是闰年。(如2000年是闰年,1100年不是闰年) 输入语句scanf("%d-%d-%d",&y,&m,&d)可以存储年,月,日.输出语句格式类似printf("%d-%02d-%02d\n",year,month,day).


#include <stdio.h> //注意此头文件一定要写对,否则提交出错
 int main()
 {
    int year=0,month=0,day=0;
    scanf("%d-%d-%d", &year, &month, &day);
 
    bool leapyear = (year % 4 == 0 && year % 100 != 0) || (year % 400 ==0);
    switch(month)
    {
//有31天的月份进行计算
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
        if (day == 31)
        {
            month++;
            day = 1;
        } 
        else
        {
            day++;
        }
        break;
//12月份比较特殊,所以单独处理
    case 12:
        if (day == 31)
        {
            year++;
            month = 1;
            day = 1;
        } 
        else
        {
            day++;
        }
        break;
//2月份也是比较特殊
    case 2:
        if (leapyear)
        {
            if (day == 29)
            {
                month ++;
                day = 1;
            }
            else
            {
                day++;
            }
        } 
        else
        {
            if (day == 28)
            {
                month ++;
                day = 1;
            }
            else
            {
                day++;
            }
        }
        break;
//30天的月份处理
    case 4:
    case 6:
    case 9:
    case 11:
        if (day == 30)
        {
            month++;
            day = 1;
        } 
        else
        {
            day++;
        }
        break;
    default:
        break;
    }
    printf("%d-%02d-%02d\n", year, month, day);
    return 0;
 }

6.话题焦点人物

描述

微博提供了一种便捷的交流平台。一条微博中,可以提及其它用户。例如Lee发出一条微博为:“期末考试顺利 @Kim @Neo”,则Lee提及了Kim和Neo两位用户。
我们收集了N(1 < N < 10000)条微博,并已将其中的用户名提取出来,用小于100的正整数表示。
通过分析这些数据,我们希望发现大家的话题焦点人物,即被提及最多的人(题目保证这样的人有且只有一个),并找出那些提及它的人。
输入
输入共两部分:
第一部分是微博数量N,1 < N < 10000。
第二部分是N条微博,每条微博占一行,表示为:
发送者序号a,提及人数k(0 < = k < = 20),然后是k个被提及者序号b1,b2...bk;
其中a和b1,b2...bk均为大于0小于100的整数。相邻两个整数之间用单个空格分隔。
输出
输出分两行:
第一行是被提及最多的人的序号;
第二行是提及它的人的序号,从小到大输出,相邻两个数之间用单个空格分隔。同一个序号只输出一次。
样例输入

5
1 2 3 4
1 0
90 3 1 2 4
4 2 3 2
2 1 3

样例输出

3
1 2 4

#include <iostream>
using namespace std;
int main(){
    int a[110][110];
    int c[110];
    int n;
    cin>>n; //输入微博数量
    for(int i=1;i<=n;i++){  
        int m,k;  
        cin>>m>>k; 
        for(int j=1;j<=k;j++) {//标记每个@过的 
            int t;
            cin>>t;
            a[t][m]=1;
            c[t]++; //@一次加1 
        }
    }
 
    int maxv=c[1],num=1;
    for(int i=2;i<=100;i++){
        if(maxv<c[i])
        {
            maxv=c[i];
            num=i;
        }
    }
    cout<<num<<endl;
    for(int i=0;i<=100;i++) {
        if(a[num][i])
            cout<<i<<' ';
    }
    return 0;
}

7.与指定数字相同的数的个数

描述

输出一个整数序列中与指定数字相同的数的个数。
输入
输入包含三行:
第一行为N,表示整数序列的长度(N <= 100);
第二行为N个整数,整数之间以一个空格分开;
第三行包含一个整数,为指定的数字m。
输出
输出为N个数中与m相同的数的个数。

样例输入

3
2 3 2
2

样例输出

2

#include <stdio.h>
int main()
{
    int N;
    scanf("%d",&N);
    int a[N];
    for(int i=0;i<N;i++)
    {
        scanf("%d",&a[i]);
    }
    int m,count=0;
    scanf("%d",&m);
    for(int i=0;i<N;i++)
    {
        if(a[i]==m)
        {
            count++;
        }
    }
    printf("%d",count);
    return 0;
}

8.陶陶摘苹果

描述

陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。
现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。
输入
包括两行数据。第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。
输出
包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。
样例输入

100 200 150 140 129 134 167 198 200 111
110

样例输出

5

#include<iostream>
#include<cstdio>
using namespace std;
int a[15];
int main()
{    
    int b=0,c,e,f,n;
    for(int i=1;i<=10;i++) //循环输入苹果高度
       cin>>a[i];
    cin>>n;n=n+30; //输入她手长加凳子高度
    for(int i=1;i<=10;++i)//进行比较,能不能摘到。可以就累加1
       if(n>=a[i])
         b++;
    cout<<b<<endl;
    return 0;
}

9.计算书费

描述

下面是一个图书的单价表:
计算概论 28.9 元/本
数据结构与算法 32.7 元/本
数字逻辑 45.6元/本
C++程序设计教程 78 元/本
人工智能 35 元/本
计算机体系结构 86.2 元/本
编译原理 27.8元/本
操作系统 43 元/本
计算机网络 56 元/本
JAVA程序设计 65 元/本
给定每种图书购买的数量,编程计算应付的总费用。
输入
输入一行,包含10个整数(大于等于0,小于等于100),分别表示购买的《计算概论》、《数据结构与算法》、《数字逻辑》、《C++程序设计教程》、《人工智能》、《计算机体系结构》、《编译原理》、《操作系统》、《计算机网络》、《JAVA程序设计》的数量(以本为单位)。每两个整数用一个空格分开。
输出
输出一行,包含一个浮点数f,表示应付的总费用。精确到小数点后一位。
样例输入

1 5 8 10 5 1 1 2 3 4

样例输出

2140.2

#include <iostream> 
#include <cstdio>   
using namespace std;
int main()
{
    double a[10]={28.9,32.7,45.6,78,35,86.2,27.8,43,56,65};//价格存放 
    double x,s=0;
    for(int i=0;i<10;i++) 
    {
        cin>>x; //每次输入本数 
        s+=a[i]*x;//对应本数乘对应价格 累加 
    }
    printf("%.1lf\n",s);//保留一位小数输出 
    return 0;
}

10.年龄与疾病

描述

某医院想统计一下某项疾病的获得与否与年龄是否有关,需要对以前的诊断记录进行整理,按照0-18、19-35、36-60、61以上(含61)四个年龄段统计的患病人数占总患病人数的比例。
输入
共2行,第一行为过往病人的数目n(0 < n <= 100),第二行为每个病人患病时的年龄。
输出
按照0-18、19-35、36-60、61以上(含61)四个年龄段输出该段患病人数占总患病人数的比例,以百分比的形式输出,精确到小数点后两位。每个年龄段占一行,共四行。
样例输入

10

1 11 21 31 41 51 61 71 81 91

样例输出

20.00%
20.00%
20.00%
40.00%

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    int n,i;
    int age[100];
    double percent[4]= {0};
 
    cin>>n;//病人数n
    for(i=0; i<n; i++)  
        cin>>age[i]; //患病年龄
 
    for(i=0; i<n; i++)
    {
        if(age[i]<=18)  
            percent[0]++;//统计年龄在19岁以下的人数
        if((age[i]>=19)&&(age[i]<=35))    
            percent[1]++;//统计年龄在19到35岁的人数
        if((age[i]>=36)&&(age[i]<=60))    
            percent[2]++;//统计年龄在36到60岁的人数
        if(age[i]>=61)  
            percent[3]++;//统计年龄在60岁以上的人数
    }
 
    cout<<setiosflags(ios::fixed)<<setprecision(2);//格式输出控制,保留两位小数
    for(i=0; i<4; i++) //转换成百分数的形式输出
    {
        percent[i]=percent[i]*100.0/n;
        cout<<percent[i]<<"%"<<endl;
    }
 
    return 0;
}

11.校门外的树

描述

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入
第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

对于20%的数据,区域之间没有重合的部分;
对于其它的数据,区域之间有重合的情况。
输出
包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
样例输入

500 3
150 300
100 200
470 471

样例输出

298

#include<cstdio>
#include<iostream>
using namespace std;
int a[10005];//设a(树的棵数)的最大值为10005。 
int main(){
    int L;
    cin>>L;
    for(int i=0;i<=L;i++){//循环设一个i最开始等于0.i小于等于L,i不停地加。 
        a[i]=1;//a【0】到L都把他设为1(1是有树,0是没树).a是马路的长度。 
    }
    int M;
    cin>>M;//输入一个M(区域数); 
    for(int i=1;i<=M;i++){//循环i最开始等于1,i小于等于M,i不停地加。 
        int c,d;
        cin>>c>>d;
        for(int j=c;j<=d;j++){//循环把c到d的树拔掉。
            a[j]=0;
        }
    }
    int x;
    x=0;
    for(int j=0;j<=L;j++){//循环设一个数为j,j最开始等于0,j小于等于L,j不停地加。 
        if(a[j]==1){
            x++;
        }
    }
    printf("%d",x);//输出数x(最后剩下的树)。 
    return 0;
}

12.打印月历

描述

给定年月,打印当月的月历表。
输入
输入为一行两个整数,第一个整数是年份year(1900 ≤ year ≤ 2099),第二个整数是月份month(1 ≤ month ≤ 12),中间用单个空格隔开。
输出
输出为月历表。月历表第一行为星期表头,如下所示:
Sun Mon Tue Wed Thu Fri Sat
其余各行一次是当月各天的日期,从1日开始到31日(30日或28日)。 日期数字应于星期表头右对齐,即各位数与星期表头相应缩写的最后一个字母对齐。日期中间用空格分隔出空白。
样例输入

2006 5

样例输出

Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
提示
闰年判断方法:能被4整除但不能被100整除,或者能被400整除。 1900年1月1日是周一。


#include<math.h>
#include<cstdio>
#include<cstdlib>
#include<cstring>
int main()
{
    int y,m;
    scanf("%d %d",&y,&m);
    int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    if((y%4==0&&y%100!=0)||y%400==0)
    {
        a[2]++;
    }
    long long s=0;
    if(y==1900)
    {
        s=1;
    }
    for(int i=1900;i<y;i++)
    {
        if((i%4==0&&y%100!=0)||(y%400==0))
        {
            s=s+2;
        }
        else s++;
        //printf("%d\n",s);
    }
    s=s%7;
    for(int i=1;i<m;i++)
    {
        s=s+a[i];
    }
    //printf("%d\n",s);
    s=s%7;
    int t=0;
    printf("Sun Mon Tue Wed Thu Fri Sat\n");
    for(int i=1;i<=s;i++)
    {
        printf("    ");
        t++;
    }
    for(int i=1;i<=a[m];i++)
    {
        if(i<10)
        {
            printf("  %d ",i);
        }
        else
        {
            printf(" %d ",i);
        }
        t++;
        if(t==7)
        {
            t=0;
            printf("\n");
        }
    }
}

13.计算两个日期之间的天数

描述

给定两个日期,计算相差的天数。比如2010-1-1和2010-1-3相差2天。
输入
共两行:
第一行包含三个整数startYear,startMonth,startDay,分别是起始年、月、日。
第二行包含三个整数endYear,endMonth,endDay,分别是结束年、月、日。
相邻两个整数之间用单个空格隔开。

年份范围在1~3000。保证日期正确且结束日期不早于起始日期。
输出
输出一个整数,即是两个日期相差的天数。
样例输入

2008 1 1
2009 1 1

样例输出

366
提示
闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。闰年的2月份有29天。

#include<iostream>
 using namespace std;
 int main(void){
        int sy,sm,sd,ey,em,ed,C=0;
        int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
        cin>>sy>>sm>>sd;
        cin>>ey>>em>>ed;
        if(ey-sy==0)
        {
                if((sy%4==0&&sy%100!=0)||(sy%400==0))
                        m[2]=29;
                for(int i=sm;i<em;i++)
                {
                        if(i==sm)
                                C=m[i]-sd;
                        else
                            C+=m[i];
                }
                C+=ed;
                if(sm==em)C=ed-sd;
                return C;

        }
        else{
                for(int i=sy;i<ey;i++)
                {
                        if(i%4==0&&i%100!=0||i%400==0)C+=366;
                        else C+=365;
                }
                if(sy%4==0&&sy%100!=0||sy%400==0) m[2]=29;
                for(int i=1;i<sm;i++) C-=m[i];
                C-=sd;
                if(ey%4==0&&ey%100!=0||ey%400==0) m[2]=29;
                else m[2]=28;
                for(int i=1;i<em;i++)C+=m[i];
                C+=ed;
                return C;
        }
        return 0;
    }

14、统计字符数

描述

给定一个由a-z这26个字符组成的字符串,统计其中哪个字符出现的次数最多。
输入
输入包含一行,一个字符串,长度不超过1000。
输出
输出一行,包括出现次数最多的字符和该字符出现的次数,中间以一个空格分开。如果有多个字符出现的次数相同且最多,那么输出ASCII码最小的那一个字符。
样例输入

abbccc

样例输出

c 3

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main() {
    int cnt[26];
    int max=0;
    int len;
    char str[1010];//字符串
    char ch;
    memset(str,0,sizeof(str));//清零
    memset(cnt,0,sizeof(cnt));//清零
    gets(str);//获取字符串 
    len=strlen(str);//获取长度 
    for(int i=0; i<len; i++) {//计数 
        cnt[str[i]-'a']++;//把计数器此字符的ASCII码-a的ASCII的那一项加一 
    }
    for(int i=0; i<26; i++) {//找最大值 
        if(cnt[i]>max) {//用大于号做判断不用考虑输出ASCII小的那个,用大于等于就需要考虑 
            ch=(char)i+'a';//i+a的ASCII转成字符保存 
            max=cnt[i]; 
        }
    }
    cout<<ch<<" "<<max; //输出出现次数最多的字符和该字符出现的次数
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容