C++三级抽测题目(答案+题目)

今天我给大家出一套C++三级考题

限时1.5小时,大家加油!!!

题目1:回文数

回文数题目描述

若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。例如:给定一个十进制数 56 ,将 56 加 65 (即把 56 从右向左读),得到 121 是一个回文数。

又如:数87:

STEP1:87+78=165
STEP2:165+561=726
STEP3:726+627=1353
STEP4:1353+3531=4884

在这里的一步是指进行了一次加法,上例最少用了 4 步得到回文数 4884 。

写一个程序,给定一个数 M ,求最少经过几步可以得到回文数。如果在 30 步以内(包含 30 步)不可能得到回文数,则输出 Impossible! 。

输入格式

一个整数 M ( 0 < M < {10}^{12}1012 )。

输出格式

如果能在 30 步以内得到回文数,输出步数

否则输出 Impossible!。

样例

输入数据 1

87

输出数据 1

4

题目2:素质考核

题目描述

一年一度的士兵素质考核即将开始了,每个郡都会选出部分士兵,到中心城参加考核,为了公平,距离中心城越远的地方,可以越早进入中心城,以缓解旅途的疲劳。中央城的士兵不需要参加考核,即中心城参加考核人数为 0 。

输入n个整数,表示每个郡参加考核的士兵人数, n 为奇数,第一个数和最后一个数表示距离中央城最远的两个郡,以此类推,中间的数为 0 ,表示中央城参与考核人数为0。

要求输出每天累计到达中央城的士兵人数。

输入格式

第 1 行 1 个整数 n(奇数),范围在 [1,100000]。

第 2 行有 n 个 [1,10000] 范围的整数,整数间用一个空格分隔。

输出格式

( N - 1 ) / 2 个 整数。

样例

输入数据 1

9
4 2 5 1 0 3 1 5 7

输出数据 1

11 18 24 28

题目3: 有序数组的合并

题目描述

输入两个正整数 N 和 M ,输入 N 个数放到 a 数组里面,输入 M 个数放到b数组里面,a ,b 数组都为从小到大排序的数组,要求把两个数组合并,并使新的数组仍然是有序的,输出新数组。

输入格式

第 1 行 2 个正整数:N,M,范围在 [1,8000000]。

第 2 行 N 个可以相同的正整数:范围在 [1,8000000]。

第 3 行 M 个可以相同的正整数:范围在 [1,8000000]。

输出格式

一行, N+M 个数,为合并后的数组。

样例

输入数据 1

5 4
1 3 5 7 9
2 4 6 8

输出数据 1

1 2 3 4 5 6 7 8 9

程序填空

#include<bits/stdc++.h>
using namespace std;
int n,m,a[8000001],b[8000001],c[16000001];
int main()
{
	scanf("%d %d",&n,&m);
	int i,j,k,l;
	
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
		
	for(i=1;i<=m;i++)
		scanf("%d",&b[i]);

	k=1;
	for(i=1,j=1;i<=n&&j<=m;k++) 
	{ 
		if(a[i]<=b[j])
		{
			c[k] = a[i];
			i++; 
		}
		else
		{
			c[k] = b[j];
			填空(1) ;
		}
	}


	//如果 a[n]<=b[m],那么i指针会先到达 n ,否则j指针会先到达 m
	//这意味着还有一些数据没有搬到 c 数组 

	if(填空(2))
	{
		for(l=i;l<=n;l++,k++)
			c[k] = a[l];
	}
	else
	{
		for(l=j;填空(3);l++,k++)
			c[k] = b[l];
	}

	for(i=1;i<k;i++) // k = n + m + 1 
		printf("%d ",c[i]); 

	return 0;
}

填空(1): 

填空(2): 

填空(3): 

题目4:所有奇数长度子数组的和

题目描述

给你一个正整数数组 a ,请你计算所有可能的奇数长度子数组的和。

子数组的定义为:原数组中的一个连续子序列。

请你输出数组 a 中所有奇数长度子数组的和。

输入格式

第 1 行:1 个正整数 N,不超过 10000 。

第 2 行:N 个整数,范围 [1,10000] 。

输出格式

输出一个整数。

样例

输入数据 1

5
1 4 2 5 3

输出数据 1

58

样例解释

所有奇数长度子数组和它们的和为:

[1] = 1

[4] = 4

[2] = 2

[5] = 5

[3] = 3

[1,4,2] = 7

[4,2,5] = 11

[2,5,3] = 10

[1,4,2,5,3] = 15

我们将所有值求和得到 1 + 4 + 2 + 5 + 3 + 7 + 11 + 10 + 15 = 58

题目5:美人松的高度美人松的高度

题目描述

又到过年了,狗熊岭的动物们都忙碌了起来,张灯结彩准备过年。李老板却要光头强砍一些百年美人松回去。现在光头强看到丛林里有N棵美人松,当然每棵松的高度是已知的。李老板要问光头强:高度为K的美人松有多少棵?

输入格式

第一行一个正整数N, 1 <= N <= 1000000 。

第二行 N 个正整数,之间用一个空格隔开,表示N棵美人松的高度,1<=高度<=1000000。

第三行一个正整数 K ,表示询问高度为 K 的美人松有多少棵。

输出格式

一行一个整数,表示对应高度为K的树的数量,如果没有则输出0。

样例

输入数据 1

5
3 4 5 2 3
3

输出数据 1

2

题目6:单词删除

题目描述

给你一个单词,在句子中删除所有的这个单词。

输入格式

两行

第 1 行为一个单词

第 2 行为包含若干个该单词的句子。

输出格式

输出 1 行,为删除单词后的句子。

样例

输入数据 1

bc
abc akg abc jiklabc asdfabckjo;

输出数据 1

a akg a jikla asdfakjo;

程序填空

#include<bits/stdc++.h>
using namespace std;
string s,str; 
int main(){

	int len;
	cin>>s; //输入单词
	填空(1) ; //用 getchar() 接收一个字符(第一行单词后尾的换行符) 
	getline(cin,str); //用getline()读取句子,存放在str中 
	
	len = 填空(2).size(); //获取单词长度
	while(str.find(s)!= 填空(3) )
	{
		str. 填空(4) (str.find(s), 填空(5) ); //在查找到单词的首位置开始,删除一个单词长度的单词 
	} 
	
	cout<<str;
	 
    return 0;
}

填空(1) : 

填空(2) : 

填空(3) : 

填空(4) : 

填空(5) : 

题目7:猴子选大王

题目描述

n 只猴子要选大王,选举方法如下:所有猴子按 1 , 2 , ... , n 编号并按照顺序围成一圈,从第 k 个猴子起,由 1 开始报数,报到 m 时,该猴子就跳出圈外,下一只猴子再次由 1 开始报数,如此循环,直到圈内只剩下一只猴子时,这只猴子就是大王。

输入格式

三个整数,猴子总数 n ( n < 1000 ),起始报数的猴子编号为 k ,出局数字为 m( m < 100 )

输出格式

猴子大王的编号。

样例

输入数据 1

10 5 3

输出数据 1

8

题目8: 回文日期

题目描述

在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。

牛牛习惯用 8 位数字表示一个日期,其中,前 4 位代表年份,接下来 2 位代表月份,最后 2 位代表日期。显然:一个日期只有一种表示方法,而两个不同的日期的表 示方法不会相同。

牛牛认为,一个日期是回文的,当且仅当表示这个日期的 8 位数字是回文的。现 在,牛牛想知道:在他指定的两个日期之间包含这两个日期本身),有多少个真实存 在的日期是回文的。

一个 8 位数字是回文的,当且仅当对于所有的 i ( 1 <= i <= 8 ) 从左向右数的第 i 个 数字和第 9-i 个数字(即从右向左数的第 i 个数字)是相同的。

例如:

  1. 对于 2016 年 11 月 19 日,用 8 位数字 20161119 表示,它不是回文的。

  2. 对于 2010年 1 月 2 日,用 8 位数字 20100102 表示,它是回文的。

  3. 对于 2010 年 10 月 2 日,用 8 位数字 20101002 表示,它不是回文的。

每一年中都有 12 个月份:

其中, 1、3、5、7、8、10、12 月每个月有 31 天; 4、6、9、11 月每个月有 30 天;而对于 2 月,闰年时有 29 天,平年时有 28 天。

一个年份是闰年当且仅当它满足下列两种情况其中的一种:

  1. 这个年份是 4 的整数倍,但不是 100 的整数倍;

  2. 这个年份是 400 的整数倍。

例如:

  • 以下几个年份都是闰年: 2000、2012、2016。

  • 以下几个年份是平年: 1900、2011、2014。

输入格式

输入包括两行,每行包括一个 8 位数字。

第 1 行表示牛牛指定的起始日期 data_1data1​。

第 2 行表示牛牛指定的终止日期 data_2data2​。

保证 date_1date1​ 和 date_2date2​ 都是真实存在的日期,且年份部分一定为 4 位数字,且首位数字不为 0 。

保证 date_1date1​ 一定不晚于 date_2date2​ 。

输出格式

输出一行,包含一个整数,表示在 date_1date1​ 和 date_2date2​ 之间,有多少个日期是回文的。

样例

输入数据 1

20110101
20111231

输出数据 1

1

样例说明

符合条件的日期是20111102。

提示

枚举后面四位(月份+日期)会更快。

枚举后四位然后求出整个日期,判断是否在范围内即可。

2 月不需要判断是否是闰年,因为 0229 反过来是 9220 ,整个日期是 92200229 ,而 9220 年是闰年。

题目1答案:

代码

#include<bits/stdc++.h>
using namespace std;
long long a,i;
int main(){
    scanf("%lld",&a);
    long long k=a,l=0;
    while(k!=0)
    {
        l=l*10+k%10;
        k=k/10;
    }
    if(l==a)
    {
        cout<<i;
        return 0;
    }
    for(i=1;i<=30;i++)
    {
        k=a,l=0;
    	while(k!=0)
    	{
        	l=l*10+k%10;
        	k=k/10;
    	}
    	a=a+l;
    	k=a,l=0;
    	while(k!=0)
    	{
        	l=l*10+k%10;
         	k=k/10;
    	}
    	if(l==a)
    	{
        	cout<<i;
        	return 0;
    	}
    }
    cout<<"Impossible!";
    return 0;
}

题目2答案: 

代码

#include<bits/stdc++.h>
using namespace std;
int n,a[100001],l;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
    	scanf("%d",&a[i]);
    }
	for(int i=1,j=n;i<j;i++,j--)
	{   
        l=l+a[j]+a[i];	
		printf("%d ",l);
    }
	return 0;
}

题目3答案: 

代码

'1': j++
'2': i<=n
'3': l<=m

题目4答案: 

代码

#include<bits/stdc++.h>
using namespace std;
int n;
int main()
{
    long long a,b[10005],n;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        scanf("%lld",&a);
        b[i]=b[i-1]+a;
    }
    long long s=0;
    for(int i=1; i<=n; i+=2)
	{
        for(int l=1; l<=n-i+1; l++)
		{
            int r=l+i-1;
            s+=b[r]-b[l-1];
        }
    }
    cout<<s;
	return 0;
}

题目5答案: 

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,a[1000005],c,y=0;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    cin>>c;
    for(int i=0;i<n;i++)
    {
        if(a[i]==c)
        {    
            y++;
        }
    }
    cout<<y;
    return 0;
}

题目6答案: 

代码

'1': getchar()
'2': s
'3': '-1'
'4': erase
'5': len

题目7答案: 

代码

#include<bits/stdc++.h>
using namespace std;
bool a[101];
main()
{
	int n,m,k,s;
	int num=0,i,cnt=0;
	cin>>n>>k>>m;
	for(i=k;num<n;i++)
	{
		if(i==n+1)
		{
			i=1 ;
		}
		if(a[i])
		{
			continue;
		}
		cnt++;
		if(cnt==m&&!a[i])
		{
			s=i;
			a[i]=true;
			cnt=0;
			num++;
		}
	}
	printf("%d",s);
	return 0;
}

题目8答案:

代码

#include<bits/stdc++.h>
using namespace std;
int i,j,m,n,a,b,c,sum,ans;
int s[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int p(int i,int j)
{ 
        int q,sum;
        q=(j%10)*1000+(j/10)*100+(i%10)*10+(i/10);
        sum=q*10000+i*100+j;
        return sum;
}
int main()
{
	cin>>a>>m;
	for(int i=1;i<=12;i++)
    {
		for(int j=1;j<=s[i];j++)
        {
            c=p(i,j);
            if(c>=a&&c<=m)
            {
                ans++;            
            }
        }
    }
	printf("%d",ans);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值