一、编程题
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;
int main()
{
int a[100],n,i,x;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
cin>>x;
for(i=1;i<=n;i++)
cout<<a[i]*x<<" ";
}
解析:【喵呜刷题小喵解析】:这个题目要求将给定的整数序列中的每个整数放大x倍后输出。首先,我们定义了一个整数数组a[100]来存储输入的整数序列,变量n表示整数序列的长度,变量i用于循环,变量x表示放大的倍数。接着,我们通过cin语句读取n的值,然后通过循环读取整数序列中的每个整数,并存储在数组a中。然后,我们通过cin语句读取放大的倍数x。最后,我们通过循环将数组a中的每个整数放大x倍,并通过cout语句输出放大后的序列。注意,在读取输入时,我们使用i从0开始循环,而不是从1开始。这是因为在C++中,数组下标是从0开始的,所以我们应该从0开始循环。另外,我们在输出时,需要在每个整数后面加上一个空格,以便将每个整数分开。最后,我们在程序末尾添加了return 0语句,表示程序正常结束。
2、单词倒排
编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔。
时间限制:10000
内存限制:65536
输入
输入为一个字符串(字符串长度至多为100)。
输出
输出为按要求排序后的字符串。
样例输入
I am a student
样例输出
student a am I
参考答案:
include <bits/stdc++.h>
void flashback(char a[], int j, int p); //倒序函数
int main(void)
{
char a[10000];
int j, i, k, end;
char temp;
gets(a);
end = strlen(a)-1 ;
for (i = 0; i < end+1; i++) //先处理特殊符号
if (!isalpha(a[i])) //非字母将第一个符号替换为’ ’
{
a[i]=’ ’;
j=0; //j用来记录连续特殊带符号的个数
if(i==0) //如果是首字符 删除他
{
for(k=1;k<=end-1;k++)
a[k]=a[k+1];
a[k]=‘\0’;
}
else k=i+1; //k为特殊符号后的下一字符
while (!isalpha(a[i])&&i<(end+1))
{
i++;
j++;
}
j–;
if(i==(end+1) ) //如果特殊字符结尾,截断字符串
a[k-1]=‘\0’;
else {
for(k=1;k<=end-j;k++) //通过搬移数组去除掉连续的特殊字符
a[k] = a[k + j];
a[k] = ‘\0’;
}
end=strlen(a)-1;
}
flashback(a, 0, end); //句子倒序
for (i = 0; i < end; i++)
if (!isspace(a[i]) && i < end) {
j = i++;
while (!isspace(a[i]) && i < end)
i++;
if (i < end) k = –i;
else k = end;
flashback(a, j, k);
}
puts(a);
}
void flashback(char a[], int j, int p)
{
int i;
char temp;
for (i = j; i < p; i++, p–)
{
temp = a[p];
a[p] = a[i];
a[i] = temp;
}
}
解析:【喵呜刷题小喵解析】:本题要求将输入的英文字符串中的单词倒序排列。首先,我们需要处理字符串中的特殊字符,将它们替换为空格,并去除连续的特殊字符。然后,我们可以将字符串整体倒序,并再次遍历字符串,将每个单词也倒序。在处理特殊字符时,我们遍历字符串,遇到非字母字符就将其替换为空格,并统计连续非字母字符的个数。如果第一个字符就是非字母字符,我们就将其删除。如果最后一个字符是非字母字符,我们就截断字符串。否则,我们就通过搬移数组去除掉连续的非字母字符。在将字符串整体倒序时,我们定义了一个reverse函数,用于交换字符串中两个位置的字符。在主函数中,我们调用该函数将字符串整体倒序。在将每个单词也倒序时,我们再次遍历字符串,遇到非空格字符就将其后面的空格字符之前的所有字符倒序。这样,我们就得到了倒序排列的字符串。需要注意的是,本题的时间限制和内存限制较宽松,因此我们可以使用C++标准库中的函数来简化代码。例如,我们可以使用cin和cout来读取和输出字符串,使用strlen函数来获取字符串的长度,使用isalpha和isspace函数来判断字符是否为字母或空格,使用swap函数来交换两个位置的字符。这些函数都可以提高代码的可读性和可维护性。
3、
- 计算矩阵边缘元素之和
-
输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。
时间限制:10000
内存限制:65536
输入
第一行分别为矩阵的行数m和列数n(m < 100,n < 100),两者之间以一个空格分开。 接下来输入的m行数据中,每行包含n个整数,整数之间以一个空格分开。
输出
输出对应矩阵的边缘元素和
样例输入
3 3
3 4 1
3 7 1
2 0 1
样例输出
15
参考答案:
include<stdio.h>
include<stdlib.h>
int main()
{
int m,n;//矩阵的长和宽
int sum = 0;
printf(“输入矩阵的长和宽\n”);
scanf(“%d%d”,&m,&n);
int a[m][n];//存储矩阵的值
//为矩阵赋值
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
scanf(“%d”,&a[i][j]);
}
}
//打印矩阵
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
printf(“%d\t”,a[i][j]);
}
printf(“\n”);
}
//计算首尾两行:行的话就是第一行a[0][?],最后一行a[m-1][?] ,然后以列循环求和0-n
for(int i=0;i<n;i++)
{
sum = sum+a[0][i]+a[m-1][i];
}
//计算首尾两列:列的话就是第一列a[?][0],最后一列a[?][n-1],然后以行循环求和1-n-1,注意要去掉第一行和最后以行,不然重计算
for(int j=1;j<m-1;j++)
{
sum = sum+a[j][0]+a[j][n-1];
}
printf(“矩阵边缘元素之和sum=%d\n”,sum);
return 0;
}
解析:【喵呜刷题小喵解析】:首先,我们需要包含必要的头文件,即`#include 4、奇数单增序列 样例输出 参考答案: int main() { int n,i,f,t,m,j=0,a[500]; scanf(“%d”,&n); for(int i=0;i<n;i++) { scanf(“%d”,&m); if(m%2==1) //判断所输入的数据是否为奇数,若为奇数就把数存入到一维数组a[]中; { a[j]=m; j++; //用j来判断数组内的元素个数。 } } for(i=0;i<j-1;i++) //使用冒泡排序的方法对一维数组进行排序 { int q=0; for(f=0;f<j-i-1;f++) { if(a[f]>a[f+1]) { t=a[f]; a[f]=a[f+1]; a[f+1]=t; } } } if(j==1) //需要考虑数组内数据只有一个数据时的情况。 printf(“%d”,a[0]); else //数组内的数据大于一时。 { for(i=0;i<j-1;i++) { printf(“%d,”,a[i]); } if(j>=2) { printf(“%d”,a[j-1]); } } //在刚开始没有考虑数组数值为一的情况;造成一直显示结果错误! return 0; }
给定一个长度为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<stdio.h>
解析:【喵呜刷题小喵解析】:首先,程序通过`scanf`函数读取输入的正整数序列的长度`n`。然后,程序使用一个循环来读取序列中的每个数字,并检查它是否为奇数。如果是奇数,程序将其存储在数组`a`中,并增加计数器`j`。然后,程序使用冒泡排序算法对数组`a`进行排序。冒泡排序是一种简单的排序算法,它通过重复遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。最后,程序检查数组`a`中的元素数量。如果只有一个元素,程序直接打印该元素。否则,程序打印数组`a`中的所有元素,并在每个元素之间插入逗号。在打印最后一个元素时,程序不打印逗号。这个程序使用了C语言的基本语法和库函数,如`scanf`、`printf`和数组操作。同时,程序也使用了条件语句和循环结构来控制程序的流程。这个程序能够正确地读取输入的正整数序列,提取其中的奇数,并按升序输出。程序的时间复杂度和空间复杂度都是O(n),其中n是输入序列的长度。
5、实数加法
求两个实数相加的和。
题目中输入输出里出现的浮点数都有如下的形式: P1P2…Pi.Q1Q2…Qj。对于整数部分,P1P2…Pi是一个非负整数且当整数部分不为0时,P1不等于0;对于小数部分,Qj不等于0。
时间限制:1000
内存限制:65536
输入
2行,每行是一个加数。每个加数的长度不超过100。
输出
一行,即相应的和。输出保证一定是一个小数部分不为0的实数。
样例输入
0.111111111111111111111111111111
0.111111111111111111111111111111
样例输出
0.222222222222222222222222222222
参考答案:
include<iostream>
include<string>
include<algorithm>
using namespace std;
int main()
{
string a,b;
int j=0;
int m,n;
string ax,ay,bx,by;
cin>>a;
cin>>b;
int x=a.find(“.”);
int y=b.find(“.”);
ax=a.substr(0,x);
ay=a.substr(x+1);
bx=b.substr(0,y);
by=b.substr(y+1);//将整数小数分离开
if(ax.size()>bx.size())
m=ax.size();//找到最大位数
else
m=bx.size();
if(by.size()>ay.size())
n=by.size();
else
n=ay.size();
while(ax.size()!=m)
ax=“0”+ax;//整数部分补0(在前面补)
while(bx.size()!=m)
bx=“0”+bx;
while(ay.size()!=n)
ay+=“0”;//小数补0(在后面补)
while(by.size()!=n)
by+=“0”;
int k=0;
string zheng=““,xiao=””;
for(int i=n-1;i>=0;i–)//注意要倒序
{
xiao+=((k+(ay[i]-‘0’)+(by[i]-‘0’))%10+‘0’);//k起到进位的作用
k=(k+(ay[i]-‘0’)+(by[i]-‘0’))/10;//进几
}
for(int i=m-1;i>=0;i–)
{
zheng+=((k+(ax[i]-‘0’)+(bx[i]-‘0’))%10+‘0’);
k=(k+(ax[i]-‘0’)+(bx[i]-‘0’))/10;
}
if(k!=0)
zheng+=k+‘0’;
int c;
for (c=0;c<xiao.length();c++)
if (xiao[c] != ‘0’)
break;//去掉小数部分0
reverse(zheng.begin(), zheng.end());//将整数部分倒序
cout << zheng << “.”;
for (int i = xiao.length() - 1; i>=c; i–)//也可以用reverse
cout << xiao[i];
cout << endl;
}
解析:【喵呜刷题小喵解析】:这是一个涉及浮点数加法的问题。对于两个实数相加,整数部分和小数部分需要分开处理。首先,我们需要将输入的字符串形式的实数分割成整数部分和小数部分。然后,我们需要对整数部分和小数部分进行对齐,即在小数点后的位数少的数前面补0,使其与位数多的数对齐。接着,我们需要对整数部分和小数部分进行相加。对于小数部分,由于每一位上的数字相加可能会产生进位,我们需要记录进位值,并在下一位相加时加上。最后,我们需要将相加后的结果输出。整数部分和小数部分需要倒序输出,因为我们是从低位开始相加的。在输出小数部分时,我们需要去掉前导的0。注意,这个答案中使用了字符串来处理实数,这样可以避免浮点数精度问题。同时,由于题目要求输出的小数部分不为0,所以在输出小数部分时,我们只需要输出从非0位开始到小数点后的所有位。
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!




