一、编程题(共5题,共100分)
1. 数字放大
给定一个整数序列以及放大倍数x,将序列中每个整数放大x倍后输出。
时间限制:1000
内存限制:65536
【输入】
包含三行: 第一行为N,表示整数序列的长度(N ≤ 100); 第二行为N个整数(不超过整型范围),整数之间以一个空格分开; 第三行包含一个整数(不超过整型范围),为指定的整数x。
【输出】
N个整数,为原序列放大之后的序列,整数之间以一个空格分开。
【样例输入】
3
1 5 7
2
【样例输出】
2 10 14
提示: 注意答案的数据范围
参考答案
#include<bits/stdc++.h>
using namespace std;
long long a[105];
int main(){
long long n , x;
cin >> n;
for(int i = 0;i < n;i++){
cin >> a[i];
}
cin >> x;
for(int i = 0;i < n;i++){
cout << a[i] * x << " ";
}
return 0;
}
2. 单词倒排
编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔。
时间限制:10000
内存限制:65536
【输入】
输入为一个字符串(字符串长度至多为100)。
【输出】
输出为按要求排序后的字符串。
【样例输入】
I am a student
【样例输出】
student a am I
参考答案
#include<bits/stdc++.h>
using namespace std;
string s[100005];
int main(){
int n = 0;
while(cin >> s[n]){
n++;
}
for(int i = n - 1;i >= 0;i--){
cout << s[i] << " ";
}
return 0;
}
3. 计算矩阵边缘元素之和
所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。
时间限制:10000
内存限制:65536
【输入】
第一行分别为矩阵的行数m和列数n(m < 100,n < 100),两者之间以一个空格分开。 接下来输入的m行数据中,每行包含n个整数,整数之间以一个空格分开。
【输出】
输出对应矩阵的边缘元素和
【样例输入】
3 3
3 4 1
3 7 1
2 0 1
【样例输出】
15
参考答案
#include<bits/stdc++.h>
using namespace std;
int a[105][105];
int main(){
int n , m , sum = 0;
cin >> n >> m;
for(int i = 0;i < n;i++){
for(int j=0;j<m;j++){
cin >> a[i][j];
}
}
for(int i = 0;i < n;i++){
for(int j = 0;j < m;j++){
if(i == 0 || i == n - 1 || j == 0 || j == m - 1){
sum = sum + a[i][j];
}
}
}
cout << sum;
return 0;
}
4. 奇数单增序列
给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出。
时间限制:1000
内存限制:65536
【输入】
共2行: 第1行为 N; 第2行为 N 个正整数,其间用空格间隔。
【输出】
增序输出的奇数序列,数据之间以逗号间隔。数据保证至少有一个奇数。
【样例输入】
10
1 3 2 6 5 4 9 8 7 10
【样例输出】
1,3,5,7,9
参考答案
#include<bits/stdc++.h>
using namespace std;
int a[505];
int main(){
int n;
int ans = 0;
cin >> n;
for(int i = 0;i < n;i++){
cin >> a[i];
}
sort(a + 0 , a + n);
for(int i = 0;i < n;i++){
if(a[i] % 2 != 0){
if(ans == 1){
cout<<",";
}
cout << a[i];
ans = 1;
}
}
return 0;
}
5. 实数加法
求两个实数相加的和。
题目中输入输出里出现的浮点数都有如下的形式: P1P2…Pi.Q1Q2…Qj。对于整数部分,P1P2…Pi是一个非负整数且当整数部分不为0时,P1不等于0;对于小数部分,Qj不等于0。
时间限制:1000
内存限制:65536
【输入】
2行,每行是一个加数。每个加数的长度不超过100。
【输出】
一行,即相应的和。输出保证一定是一个小数部分不为0的实数。
【样例输入】
0.111111111111111111111111111111
0.111111111111111111111111111111
【样例输出】
0.222222222222222222222222222222
参考答案
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int main()
{
char a[202],b[202],c[101],d[101];
cin>>a;
cin>>b;
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
int i,j=0,ap=0,bp=0,ka=0,kb=0;
//ka,kb用来统计数组a和b的小数部分的位数
//ap,bp用来统计数组a和b的整数部分的位数
//统计数组a的整数部分和小数部分的位数
for(i=0; i<strlen(a); i++)
{
if(a[i]=='.')
{
break;
}
ap++;
}
ka=strlen(a)-ap-1;
//统计数组b的整数部分和小数部分的位数
for(i=0; i<strlen(b); i++)
{
if(b[i]=='.')
{
break;
}
bp++;
}
kb=strlen(b)-bp-1;
//对于整数部分从个位开始加即倒叙输入
for(i=0; i<ap||i<bp; i++)
{
if(i<ap)
{
c[i]+=a[ap-1-i]-'0';
}
if(i<bp)
{
c[i]+=b[bp-1-i]-'0';
}
if(c[i]>9) //大于9则向前进1
{
c[i+1]+=1;
c[i]%=10;
}
}
//判断是否有小数部分
if(ka>0||kb>0)
{
for(i=0; i<ka||i<kb; i++)
{
if(i<ka)
{
d[i]+=a[i+ap+1]-'0';//小数部分正序输入
}
if(i<kb)
{
d[i]+=b[i+bp+1]-'0';
}
}
//取两者最大小数位,用于输出小数输出
if(ka<kb)
{
ka=kb;
}
//取两者最大整数位
if(ap<bp)
{
ap=bp;
}
for(i=ka-1; i>0; i--) //向前进1
{
if(d[i]>9)//小数部分的进位
{
d[i-1]+=1;
d[i]%=10;
}
}
if(d[0]>9)//对第一位小数是否进位进行判断
{
c[0]+=1;
d[0]%=10;
while(c[j]>9)
{
c[j+1]+=1;
c[j]%=10;
}
}
if(c[ap]>0)
{
printf("%d",c[ap]);
}
for(i=ap-1; i>=0; i--)
{
printf("%d",c[i]);
}
printf(".");
for(i=0; i<ka; i++)
{
printf("%d",d[i]);
}
}
else
{
if(ap<bp)
{
ap=bp;
}
if(c[ap]>0)
{
printf("%d",c[ap]);
}
for(i=ap-1; i>=0; i--)
{
printf("%d",c[i]);
}
}
return 0;
}