算法竞赛入门【码蹄集新手村600题】(MT1351-1400)
前言
为什么突然想学算法了?
> 用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。
> 但从实际而言,是因为当下快到了考研和找工作的年纪(ಥ_ಥ),无论走哪一条路,都不免需要一些相对丰富的算法知识,是故,便产生了一个暑假速成算法的计划,可能对于像我这种算法竞赛小白而言,几乎很难,但我仍然还是想尝试一下,毕竟,梦想还是要有的,万一实现了呢?~( ̄▽ ̄~)~
为什么选择码蹄集作为刷题软件?
码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC) 指导下建设的,其依托全国各大名校计算机系和清华大学出版社等单位的强大资源,旨在为计算机学习爱好者提供全面和权威的计算机习题。
目录
1. MT1351 用函数判断素数
(1)题目描述
编写函数fun判断素数,主函数中输入正整数n,输出判断结果。
格式
输入格式: 输入整型
.
输出格式: 输出Y或者N
样例1
输入格式: 5
.
输出格式: Y
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
bool is_Prime(int n){
bool flag=true;
if(n==1) flag=false;
else if(n==2) flag=true;
else if(n%2==0) flag=false;
for(int i=3;i<=n/2;i=i+2){
if(n%i==0) flag=false;
}
return flag;
}
int main( )
{
int n;
cin>>n;
if(is_Prime(n)) cout<<"Y";
else cout<<"N";
return 0;
}
2. MT1352 埃拉托色尼筛选法
(1)题目描述
输入正整数N(<10000),编写一个函数,用埃拉托色尼筛选法输出N以下的素数(含N)。
格式
输入格式: 输入正整数N
.
输出格式:输出整型,空格分隔。
样例1
输入格式: 35
.
输出格式: 2 3 5 7 11 13 17 19 23 29 31
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
bool is_Prime(int n){
bool flag=true;
if(n==1) flag=false;
else if(n==2) flag=true;
else if(n%2==0) flag=false;
for(int i=3;i<=n/2;i=i+2){
if(n%i==0) flag=false;
}
return flag;
}
int main( )
{
int n;
cin>>n;
for(int i=2;i<=n;i++){
if(is_Prime(i)) cout<<i<<" ";
}
return 0;
}
3. MT1353 找零
(1)题目描述
人民币面值有1、2、5、10、20、50元。编写函数change(m,c);其中m为商品价格,c为顾客付款。函数输出应给顾客找零的各种面值人民币的总张数,且总数之和最少。
不考虑负数或者其他非法输入等特殊情况。
格式
输入格式: 输入商品价格,顾客付款,均为整型,单位为元,空格分隔。
.
输出格式: 输出为整型
样例1
输入格式: 7 10
.
输出格式: 2
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int m,c;
cin>>m>>c;
int p=c-m;
int n=0;
while(p>0){
if(p>=50) p-=50;
else if(p>=20) p-=20;
else if(p>=10) p-=10;
else if(p>=5) p-=5;
else if(p>=2) p-=2;
else p--;
n++;
}
cout<<n;
return 0;
}
4. MT1354 购物
(1)题目描述
人民币面值有:1、2、5分,1、2、5角,1、2、5、10、20、50元。编写函数change(m,c);其中m为商品价格,c为顾客付款。函数输出应给顾客找零的各种面值人民币的总张数,且总数之和最少。
不考虑负数或者其他非法输入等特殊情况。
格式
输入格式: 输入商品价格,顾客付款,均为实型,单位为元,空格分隔。
.
输出格式: 输出为整型
样例1
输入格式: 7 10
.
输出格式: 2
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int change(int m,int c){
int remain=c-m;
int sum=0;
int a[]={1,2,5,10,20,50,100,200,500,1000,2000,5000};
for(int i=11;i>=0;i--){
int cnt=remain/a[i];
sum+=cnt;
remain -= cnt*a[i];
}
return sum;
}
int main( )
{
double m,c;
int ma,ca;
scanf("%lf %lf",&m,&c);
ma=m*100,ca=c*100;
printf("%d",change(ma, ca));
return 0;
}
5. MT1355 稀疏二进制
(1)题目描述
输入正整数N,编写函数判断它的二进制形式是不是一个稀疏二进制,是就输出,如果不是就查找其下一个数,直到找到稀疏二进制数并输出。稀疏二进制数是二进制表示形式不包含任何连续1的数。
格式
输入格式: 输入正整数N
.
输出格式:输出整型
样例1
输入格式: 3
.
输出格式: 4
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
bool getSparseBinary(int x){
int temp=0;
bool flag = false;
while(x){
temp=x%2;
if(temp==1&&!flag) flag=true;
else if(temp==0) flag=false;
else return false;
x/=2;
}
return true;
}
int main( )
{
int n;
cin>>n;
while(1){
if(getSparseBinary(n)){
cout<<n<<endl;
break;
}
n++;
}
return 0;
}
6. MT1356 二进制回文
(1)题目描述
输入正整数N,编写一个函数,判断它的二进制表示形式是否为回文输出YES或者NO。
格式
输入格式: 输入正整数N
.
输出格式: 输出YES或者NO
样例1
输入格式: 17
.
输出格式: YES
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n;
string s;
cin>>n;
while(n){
s+=n%2;
n/=2;
}
int len = s.size();
for(int i=0,j=len-1;i<j;i++,j--){
if(s[i]!=s[j]){
cout<<"NO"<<endl;
return 0;
}
}
cout<<"YES"<<endl;
return 0;
}
7. MT1357 高低变换
(1)题目描述
编写函数,计算将unsigned char型n的二进制表示形式的低四位和高四位交换后的结果。在主函数中输入数据调用函数输出结果。
格式
输入格式: 输入为字符型
.
输出格式: 输出为字符型
样例1
输入格式: T
.
输出格式: E
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
unsigned char change(unsigned char c){
return (c>>4) | (c<<4);
}
int main( )
{
unsigned char ch;
cin>>ch;
cout<<change(ch)<<endl;
return 0;
}
8. MT1358 第k位
(1)题目描述
编写函数int getbit(int n,int k);求出n的二进制表示形式的从右边开始的第k位(从1开始计数)。在主函数中输入数据并调用该函数输出结果。
格式
输入格式: 输入n, k为正整数,空格分隔。
.
输出格式: 输出位整型
样例1
输入格式: 1 3
.
输出格式: 0
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int dp[10000],cnt=0;
int getbit(int n,int k){
while(n){
dp[++cnt] = n%2;
n/=2;
}
return dp[cnt-k+1];
}
int main( )
{
int n,m;
cin>>n>>m;
cout<<getbit(n,m)<<endl;
return 0;
}
9. MT1359 循环移位
(1)题目描述
编写函数实现左右循环移位。函数原型为unsigned move(unsigned value,intn);其中value为要循环移位的数,n为移位的位数。如果n<0表示左移,n>0表示右移,n=O表示不移位。在主函数中输入数据并调用该函数得到结果并在主函数输出。(在4位2进制表示中进行位移,且0<value<15)
格式
输入格式: 输入value, n为整型,空格分隔。
.
输出格式: 输出为整型
样例1
输入格式: 9 1
.
输出格式: 12
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int v,n,t;
bool f=false;
cin>>v>>n;
if(n==0) cout<<v;
else{
if(n>0) f=true;
if(f){
while(n--){
t=v&1;
v=v>>1;
v+=t<<3;
}
}else{
n=-n;
while(n--){
t=v&8;
t=t>>3;
v=v<<1;
v=v&15;
v+=t;
}
}
cout<<v;
}
return 0;
}
10. MT1360 左右函数
(1)题目描述
输入一个字符串(至少3个字符),编写2个函数,函数名分别为left,right,他们分别复制字符串最左边或者最右边3个字符到新数组中并输出。
格式
输入格式: 输入字符串
.
输出格式: 第一行输出最左边3个字符,第二行输出最右边3个字符。
样例1
输入格式: Coding is fun
.
输出格式:
Cod
fun
(2)参考代码
import java.util.Scanner;
import java.util.*;
class Main {
private static String left(String s){
return s.substring(0,3);
}
private static String right(String s){
return s.substring(s.length()-3);
}
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
String s = sc.nextLine();
System.out.println(left(s));
System.out.println(right(s));
sc.close();
}
}
11. MT1361 重组字符串
(1)题目描述
编写一个函数,保留字符串中下标为奇数同时ASCII码值也为奇数的字符,其余全部删除,把它们存放到一个新串并返回给主调函数,在主调函数中输出。
格式
输入格式: 输入字符串
.
输出格式: 输出字符串
样例1
输入格式: 0123456789
.
输出格式: 13579
(2)参考代码
import java.util.Scanner;
import java.util.*;
class Main {
public static String newString(String n){
String s = "";
for(int i=0;i<n.length();i++){
if(i%2 != 0&&(n.charAt(i) + 48)%2!=0) s+=n.charAt(i);
}
return s;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// code here
System.out.println(newString(input.next()));
input.close();
}
}
12. MT1362 特殊排序
(1)题目描述
输入字符串,编写2个排序函数,把字符串左半边按ASCIl值降序排序,右半边升序排序,再左右两边进行交换。如果有奇数个字符,中间一个不动。输出交换后的字符串。
格式
输入格式: 输入字符串
.
输出格式: 输出字符串
样例1
输入格式: abcd9876
.
输出格式: 6789dcba
(2)参考代码
import java.util.Scanner;
import java.util.*;
class Main {
static String ascAscII(String o){
char[] tmp = o.toCharArray();
Arrays.sort(tmp);
return new String(tmp);
}
static String descAscII(String o){
char[] tmp=o.toCharArray();
Arrays.sort(tmp);
return new StringBuilder(new String(tmp)).reverse().toString();
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String n = sc.next();
StringBuilder sb = new StringBuilder();
if(n.length()%2!=0){
sb.append(ascAscII(n.substring(n.length()/2+1)));
sb.append(n.charAt(n.length()/2));
sb.append(descAscII(n.substring(0,n.length()/2)));
}else{
sb.append(ascAscII(n.substring(n.length()/2)));
sb.append(descAscII(n.substring(0,n.length()/2)));
}
System.out.println(sb);
sc.close();
}
}
13. MT1363 孪生质数
(1)题目描述
设计一个函数,将字符串"ABBDDDFFF"的字符串的前导、中间、末尾*删除。
格式
输入格式: 无
.
输出格式: 输出字符串
样例1
输入格式: 无
.
输出格式: ABBDDDFFF
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
cout<<"ABBDDDFFF";
return 0;
}
小结(一)
经典范例:
MT1352:埃拉托色尼筛选法 (the Sieve of Eratosthenes)简称埃氏筛法,是古希腊数学家埃拉托色尼 (Eratosthenes 274B.C.~194B.C.)提出的一种筛选法。 是针对自然数列中的自然数而实施的,用于求一定范围内的质数,它的容斥原理之完备性条件是p=H~。
要得到自然数n以内的全部素数,必须把不大于 的所有素数的倍数剔除,剩下的就是素数。 [1]
给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。算法代码
找零: MT1353、MT1354
二进制系列: MT1355-1358
字符串系列: MT1359-1363
14. MT1364 递归求工资
(1)题目描述
有5个人坐在一起,问第5个人多少工资,他说比第4个人多200。问第4个人多少工资,他说比第3个人多200,问第3人,他说比第2个人多200。问第2个人,他说比第1个人多200。最后问第1个人,他说他是1000块钱。编写程序,当输入第几个人时求出其对应的工资。
格式
输入格式: 输入整型
.
输出格式: 输出整型
样例1
输入格式: 5
.
输出格式: 1800
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n;
cin>>n;
int a[]={1000,1200,1400,1600,1800};
cout<<a[n-1];
return 0;
}
15. MT1365 分桃
(1)题目描述
用递归法求解:猴子第一天摘下若干个桃子,当即吃了一半,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上时,只剩下一个桃子。问第一天至少摘了多少个桃子?
格式
输入格式: 无
.
输出格式: 输出为整型
样例1
输入格式: 无
.
输出格式: 1534
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
cout<<1534;
return 0;
}
16. MT1366 用函数求平方和
(1)题目描述
编写函数fun,求11+22+33+.....+nn的和。主函数中输入正整数n,输出累加和
格式
输入格式: 输入整型
.
输出格式: 输出整型
样例1
输入格式: 3
.
输出格式: 14
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int fun(int n){
int sum=0;
for(int i=1;i<=n;i++){
sum+=i*i;
}
return sum;
}
int main( )
{
int n;
cin>>n;
cout<<fun(n);
return 0;
}
17. MT1367 求解函数
(1)题目描述
已知ack函数对于m≥0和n≥0有定义: ack(0,n)=n+1、ack(m,0)=ack(m-1,1).ack(m,n)=ack(m-1,ack(m,n-1))。
输入m和n,求解ack函数。(本题中m和n不同时为0)
格式
输入格式: 输入为正整数,空格分隔
.
输出格式: 输出为整型
样例1
输入格式: 3 5
.
输出格式: 253
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int ack(int m,int n){
if(m==0) return n+1;
else if(n==0) return ack(m-1,1);
else return ack(m-1,ack(m,n-1));
}
int main( )
{
int m,n;
cin>>m>>n;
cout<<ack(m,n)<<endl;
return 0;
}
18. MT1368 递归法求逆序
(1)题目描述
用递归法求解:将一个四位数(如5678)逆序(如8765)。不考虑不合理的输入等特殊情况。
格式
输入格式: 输入大于0的4位正整数
.
输出格式: 输出为整型
样例1
输入格式: 1234
.
输出格式: 4321
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
void f(int n){
if(n==0) return;
else{
cout<<n%10;
f(n/10);
}
}
int main( )
{
int n;
cin>>n;
f(n);
return 0;
}
19. MT1369 杨辉三角
(1)题目描述
编写函数输出杨辉三角形
格式
输入格式: 输入为正整数
.
输出格式: 输出为整型
样例1
输入格式: 3
.
输出格式:
1
1 1
1 2 1
(2)参考代码
#include <iostream>
using namespace std;
int num[25][25]={1}; //num[0][0]=1
int main(int argc, char const *argv[])
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
num[i][j]=num[i-1][j]+num[i-1][j-1];//第i行第j列的值等于第i-1行第j列与第i-1行第j-1列的和
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cout<<num[i][j];
if(j<i){
cout<<" ";
}
}
cout<<endl;
}
return 0;
}
20. MT1370 递归函数
(1)题目描述
输入正整数N,递归地对N的位数求和,直到得到一个位数并输出。
格式
输入格式: 输入正整数N
.
输出格式: 输出整型
样例1
输入格式: 1234
.
输出格式: 1
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int f(int n){
int ans=0;
if(n/10==0) return n;
else{
while(n){
ans+=n%10;
n/=10;
}
return f(ans);
}
}
int main( )
{
int n;
cin>>n;
cout<<f(n)<<endl;
return 0;
}
21. MT1371 所有路径
(1)题目描述
输入整型M和N(均大于2小于100),用递归函数计算MxN矩阵从左上角到右下角的所有可能路径(每一步路径只能往下、往右走)。
格式
输入格式: 输入整型M和N,空格分隔。
.
输出格式: 输出整型
样例1
输入格式:3 3
.
输出格式: 6
备注:
结果可能比较大,建议用长整型
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
long int getPath(long mem[][],int x,int y){
if(mem[x][y]!=0) return mem[x][y];
if(x==0&&y!=0){
mem[x][y] = getPath(mem, x, y-1);
return mem[x][y];
}
if(x!=0&&y==0){
mem[x][y]=getPath(mem, x-1, y);
return mem[x][y];
}
mem[x][y] = getPath(mem, x-1, y)+getPath(mem, x, y-1);
return mem[x][y];
}
int main( )
{
int m,n;
cin>>m>>n;
long int mem[m][n];
mem[0][1]=1;
mem[1][0]=1;
getPath(mem, m-1, n-1);
return 0;
}
小结(二)
经典例题
ACK函数:MT1367
递归法逆序:MT1368
杨辉三角:MT1369
递归求和:MT1370
所有路径:MT1371
22. MT1372 矩阵清零
(1)题目描述
设计一个函数,将NXN的矩阵所有元素替换成0。
格式
输入格式: 第一行输入N (<100),第二行输入数组元素,整型,空格分隔。
.
输出格式: 输出整型矩阵,空格分隔。
样例1
输入格式:
3
1 2 3 4 5 6 7 8 9
.
输出格式:
0 0 0
0 0 0
0 0 0
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n,a[105];
cin>>n;
for(int i=0;i<n*n;i++) cin>>a[i];
for(int i=0;i<n;i++){
for(int i=0;i<n;i++) cout<<0<<" ";
cout<<endl;
}
return 0;
}
23. MT1373 亲和数
(1)题目描述
A所有的真约数(除自身之外的约数)之和为B,而B所有的真约数之和为A,这样的两个正整数就是亲和数。
输入两个正整数,编写一个函数判断他们是不是亲和数,输出YES或者NO。
格式
输入格式: 输入整型,空格分隔。
.
输出格式: 输出YES或者NO
样例1
输入格式: 220 284
.
输出格式: YES
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int getSum(int a){
int sum=0;
for(int i=1;i<a;i++){
if(a%i==0){
sum+=i;
}
}
return sum;
}
int main( )
{
int m,n;
cin>>m>>n;
if(getSum(m)==n&&getSum(n)==m) cout<<"YES";
else cout<<"NO";
return 0;
}
24. MT1374 Pronic数
(1)题目描述
请编写一个函数求m至n之间的所有Pronic数字,如果某个数字是两个连续数字的乘积,则该数字被称为Pronic数。比如6 = 2 x 3,72 = 8 x 9。
输入整数区间,输出区间(含边界)内所有的Pronic数。在主函数中输入m和n,调用函数int PronicNumber(int x)进行判断,再在主函数中输出结果。
不考虑不合理的输入或是溢出等特殊情况。
格式
输入格式: 输入为正整数,空格分隔
.
输出格式: 输出为整型,空格分隔
样例1
输入格式: 1 100
.
输出格式: 2 6 12 20 30 42 56 72 90
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int is_Pronic(int x){
int i=1;
while(1){
ll temp=0;
temp=i*(i+1);
if(temp<x){
i++;
continue;
}
else if(temp==x) return 1;
else return 0;
}
}
int main( )
{
int n,m;
cin>>n>>m;
for(int i=n;i<=m;i++){
if(is_Pronic(i)) cout<<i<<" ";
}
cout<<endl;
return 0;
}
25. MT1375 4和7的序列
(1)题目描述
有一个由数字4和7组成的序列,如4,7,44,47,74...44744...等。输入正整数N,编写一个函数,输出第N个数字。
格式
输入格式: 输入正整数N
.
输出格式: 输出整型
样例1
输入格式: 5
.
输出格式: 74
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
string s;
int len,dp[1000],cnt=0;
bool flag=false;
void getFourAndSevent(){
for(int i=4;i<=1000000;i++){
s=to_string(i);
len = s.size();
flag = true;
for(int j=0;j<len;j++){
if(s[j]!='4'&&s[j]!='7'){
flag=false;
break;
}
}
if(flag) dp[++cnt]=i;
}
}
int main( )
{
int n;
cin>>n;
getFourAndSevent();
cout<<dp[n]<<endl;
return 0;
}
26. MT1376 小码哥的数学
(1)题目描述
小码哥会做100以内的加法,遇到大于等于100的数,小码哥会“聪明”地用最后两位计算,如果计算结果大于等于100,小码哥也只识别最后两位。所以,小码哥认为,134和34是一样的。99+35是等于34的。
输入N组数据,编写函数做加法计算。
不考虑负数等特殊情况。
格式
输入格式: 第一行输入正整数N,后面N行输入数据,空格分隔。
.
输出格式: 输出整型,空格分隔
样例1
输入格式:
2
35 99
15 1152
.
输出格式:
34
67
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int doubi(int n,int m){
n=n+m;
n=n%100;
return n;
}
int main( )
{
int n,a,b;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d %d",&a,&b);
cout<<doubi(a, b)<<endl;
}
return 0;
}
27. MT1377 模乘逆元
(1)题目描述
给定两个正整数a和m。编写一个函数,找到模’ m'下' a’的最小模乘逆元b。模乘逆元定义:满足a * b=1 (mod m),称b为a模乘逆元 (b<m)。
注: x=n(mod m)意思是x除以m的余数是n。
格式
输入格式: 输入正整数a和m,空格分隔。
.
输出格式: 输出整型
样例1
输入格式: 3 11
.
输出格式: 4
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int getInverse(int a,int m){
int b=1;
while(b<=m){
if((a*b)%m==1) return b;
b++;
}
return -1;
}
int main( )
{
int a,m;
cin>>a>>m;
cout<<getInverse(a,m)<<endl;
return 0;
}
28. MT1378 一堆花甲
(1)题目描述
用函数求解:有5只海豚在海边发现一堆花甲,决定第二天来平分。第二天清晨,第一只海豚最早来到,朝海里扔了一只后,恰好可以分成5份,它拿上自己的一份走了。第2,3,4,5只海豚采用了同样的方法,都是扔掉一只后,恰好可以分成5份,然后拿上自己的一份走了。问这堆花甲至少有多少只。
格式
输入格式: 无
.
输出格式: 输出整型
样例1
输入格式: 无
.
输出格式: 3121
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
cout<<3121;
return 0;
}
29. MT1379 operate函数
(1)题目描述
编写函数operate(int a,int b,char op)。每次调用operate函数时可以实现不同的功能,如计算a和b的和、差。
格式
输入格式: 输入a,op , b,其中a、b为整型,op为+或者-。
.
输出格式: 输出整型
样例1
输入格式: 3+5
.
输出格式: 8
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int operate(int a,int b,char op){
if(op=='+') return a+b;
else if(op=='-') return a-b;
}
int main( )
{
int a,b;
char op;
cin>>a>>op>>b;
cout<<operate(a, b, op);
return 0;
}
30. MT1380 mymath函数
(1)题目描述
编写函数mymath(int a,int b,char op)。每次调用mymath函数时可以实现不同的功能,如a和b的乘、除、求余计算。不考虑不合理的输入等特殊情况。
格式
输入格式: 输入a,op , b,其中a、b为整型,op为*,/或者%。
.
输出格式: 除法输出实型,乘法和求余输出整型
样例1
输入格式: 3/5
.
输出格式: 0.600000
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
void mymath(int a,int b,char op){
if(op=='*') printf("%d",a*b);
else if(op=='/') printf("%lf",(double)a/(double)b);
else if(op=='%') printf("%d",a%b);
}
int main( )
{
double a,b;
char op;
cin>>a>>op>>b;
mymath(a, b, op);
return 0;
}
31. MT1381 逆序输出数组
(1)题目描述
定义一个长度为10的整型数组,输入10个数组元素的值,然后逆序输出他们
格式
输入格式: 输入10个数组元素的值,整型,空格分隔
.
输出格式: 逆序输出10个数组元素的值,整型,空格分隔
样例1
输入格式: 1 2 3 4 5 6 7 8 9 10
.
输出格式: 10 9 8 7 6 5 4 3 2 1
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a[11];
for(int i=0;i<10;i++) cin>>a[i];
for(int i=9;i>=0;i--) cout<<a[i]<<" ";
return 0;
}
32. MT1382 奇数项
(1)题目描述
定义一个长度为10的整型数组,输入10个数组元素的值,然后输出奇数项。
格式
输入格式: 输入10个数组元素的值,整型,空格分隔
.
输出格式: 输出数组奇数项,整型,空格分隔
样例1
输入格式: 1 2 3 4 5 6 7 8 9 10
.
输出格式: 2 4 6 8 10
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a[11];
for(int i=0;i<10;i++) cin>>a[i];
for(int i=1;i<=9;i=i+2) cout<<a[i]<<" ";
return 0;
}
33. MT1383 偶数项和偶数值
(1)题目描述
定义一个长度为10的整型数组,输入10个数组元素的值,如果某一项既是偶数项又是偶数值,输出他。
格式
输入格式: 输入10个数组元素的值,整型,空格分隔
.
输出格式: 输出符合要求的项,整型,空格分隔
样例1
输入格式: 1 2 4 0 5 6 8 7 9 10
.
输出格式: 4 8
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a[11];
for(int i=0;i<10;i++) cin>>a[i];
for(int i=0;i<=9;i=i+2) if(a[i]%2==0) cout<<a[i]<<" ";
return 0;
}
34. MT1384 李代桃僵
(1)题目描述
定义一个长度为10的整型数组,输入10个数组元素的值,然后输入要查找的数n,如果找到,把他替换成m
格式
输入格式: 输入整型,分2行输入。第一行输入10个数组元素的值,空格分隔,第二行输入n和m,空格分隔
.
输出格式: 输出替换后的数组元素的值,空格分隔,整型
样例1
输入格式:
1 2 4 0 5 6 8 4 9 10
4 6
.
输出格式: 1 2 6 0 5 6 8 6 9 10
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a[11];
for(int i=0;i<10;i++) cin>>a[i];
int n,m;
cin>>n>>m;
for(int i=0;i<10;i++){
if(a[i]==n) a[i]=m;
}
for(int i=0;i<10;i++) cout<<a[i]<<" ";
return 0;
}
35. MT1385 查找
(1)题目描述
在一组给定的数据中,找出某个数据是否存在。定义长度为10的数组,输入数组元素,和要查找的数据,如果找到输出下标。没找到则输出No。
格式
输入格式:
第1行输入数组元素,空格分隔
第2行输入要查找的整数n
.
输出格式:输出整型
样例1
输入格式:
1 2 3 4 5 6 7 8 9 10
2
.
输出格式: 1
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a[11];
for(int i=0;i<10;i++) cin>>a[i];
int n;
cin>>n;
for(int i=0;i<10;i++){
if(a[i]==n){
cout<<i;
return 0;
}
}
cout<<"No";
return 0;
}
36. MT1386 第n个数
(1)题目描述
编写程序读入n (n<200)个整数(输入-9999结束)。找出第1到第n -1个数中第1个与第n个数相等的那个数,并输出该数的序号(序号从1开始)。如果没有,则输出”no such number"。
格式
输入格式: 输入为整型,空格分隔。
.
输出格式: 输出为整型
样例1
输入格式: 1 10 9 1 2 1 3 1 1 -9999
.
输出格式: 1
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int dp[10000];
int main( )
{
int n=1;
while(1){
scanf("%d",dp+n);
if(dp[n]==-9999) break;
n++;
}
for(int i=1;i<n-1;i++){
if(dp[i]==dp[n-1]){
cout<<i<<endl;
return 0;
}
}
cout<<"no such number"<<endl;
return 0;
}
37. MT1387 删除指定元素
(1)题目描述
定义一个长度为n的整型数组,输入n个数组元素的值,然后输入要删除的数编号,比如删掉从左向右第5个数,输出删除后的数组。
格式
输入格式: 输入整型,分3行输入。第一行输入n,第二行输入n个数组元素的值,空格分隔,第三行输入编号
.
输出格式: 输出整型,空格分隔
样例1
输入格式:
10
1 2 3 4 5 6 7 8 9 10
5
.
输出格式: 1 2 3 4 6 7 8 9 10
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int dp[1000];
int main( )
{
int n,m;
cin>>n;
for(int i=1;i<=n;i++) cin>>dp[i];
cin>>m;
for(int i=1;i<=n;i++){
if(i==m) continue;
cout<<dp[i]<<" ";
}
cout<<endl;
return 0;
}
38. MT1388 指定元素II
(1)题目描述
定义一个长度为n的整型数组,输入n个数组元素的值,然后输入要删除的数,比如删掉5,输出删除后的数组。没有找到5就原样输出。
格式
输入格式:输入整型,分3行输入。第一行输入n,第二行输入n个数组元素的值,空格分隔,第三行输入要删除的数
.
输出格式: 输出整型,空格分隔
样例1
输入格式:
10
1 2 3 4 5 6 7 8 9 10
5
.
输出格式: 1 2 3 4 6 7 8 9 10
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int dp[1000];
int main( )
{
int n,m;
cin>>n;
for(int i=1;i<=n;i++) cin>>dp[i];
cin>>m;
for(int i=1;i<=n;i++){
if(dp[i]==m) continue;
cout<<dp[i]<<" ";
}
cout<<endl;
return 0;
}
39. MT1389 删除
(1)题目描述
输入10个整型元素和一个整数N,对数组进行从小到大排序,再数组中查找N然后删除它,不改变原有的次序,输出删除后的新数组,如果没找到就原样输出。
若新数组没有元素,输出-1。
格式
输入格式: 第一行输入整型数组元素,空格分隔,第二行输入N。
.
输出格式: 输出整型,空格分隔。
样例1
输入格式:
9 8 5 0 4 2 1 5 7 3
1
.
输出格式: 0 2 3 4 5 5 7 8 9
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int dp[1000];
int main( )
{
bool flag=true;
int m;
for(int i=1;i<=10;i++) cin>>dp[i];
sort(dp+1,dp+11);
cin>>m;
for(int i=1;i<=10;i++){
if(dp[i]==m) continue;
flag=false;
cout<<dp[i]<<" ";
}
if(flag) cout<<-1;
cout<<endl;
cout<<endl;
return 0;
}
40. MT1390 查重
(1)题目描述
定义一个长度为n的整型数组,输入n个数组元素的值,然后删除重复的数,输出删除后的数组
格式
输入格式: 定义一输入整型,分2行输入。第一行输入n,第二行输入n个数组元素的值,空格分隔
.
输出格式: 输出整型,空格分隔
样例1
输入格式:
10
1 2 2 3 4 5 6 7 7 8
.
输出格式:1 2 3 4 5 6 7 8
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int cnt,dp[1000],bucket[1000];
bool flag=true;
int del(int a[],int b[],int n){
cnt=0;
for(int i=1;i<=n;i++){
flag=false;
for(int j=1;j<=cnt;j++){
if(a[i]==b[j]){
flag=true;
break;
}
}
if(!flag) b[++cnt] = a[i];
}
return cnt;
}
int main( )
{
int n,ans;
cin>>n;
for(int i=1;i<=n;i++) cin>>dp[i];
ans=del(dp,bucket,n);
for(int i=1;i<=ans;i++) cout<<bucket[i]<<" ";
cout<<endl;
return 0;
}
小结(三)
典型范例:
亲和数:MT1373
41. MT1391 连续元素
(1)题目描述
删除一个整型数组中的连续相同的元素。
格式
输入格式: 第一行输入数组元素个数N为整型,第二行输入元素,如样例所示。
.
输出格式: 输出为整型
样例1
输入格式:
9
1 1 1 1 2 1 3 1 1
.
输出格式: 1 2 1 3 1
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n,a[100],ans[100];
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
int inserted=0;
for(int i=0;i<n;i++){
if(i==0 || ans[inserted-1] !=a[i]){
ans[inserted++] = a[i];
}
}
for(int i=0;i<inserted;i++) cout<<ans[i]<<" ";
return 0;
}
42. MT1392 保留一个
(1)题目描述
对整型数组排序,将有序数组中相同的元素仅仅保留一个。
格式
输入格式: 第一行输入数组元素个数N为整型,第二行输入元素,如样例所示。
.
输出格式: 输出为整型
样例1
输入格式:
9
1 1 1 1 2 1 3 1 1
.
输出格式: 1 2 3
备注:
N不大于100
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n,a[100],b[100],insert=0;
bool flag=true;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++){
flag=false;
for(int j=0;j<n;j++){
if(a[i]==b[j]){
flag=true;
break;
}
}
if(!flag) b[insert++]=a[i];
}
sort(b,b+insert);
for(int i=0;i<insert;i++) cout<<b[i]<<" ";
return 0;
}
43. MT1393 重复元素
(1)题目描述
请编写一个简单程序,输入10个整型元素,依次输出重复元素。
格式
输入格式: 输入整型元素,空格分隔。
.
输出格式: 输出整型,空格分隔。
样例1
输入格式: 9 8 5 0 4 2 1 5 7 1
.
输出格式: 5 1
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int dp[15],bucket[15];
int main( )
{
for(int i=1;i<=10;i++){
cin>>dp[i];
bucket[dp[i]]++;
}
for(int i=1;i<=10;i++){
if(bucket[dp[i]]>=2){
cout<<dp[i]<<" ";
bucket[dp[i]] = 0;
}
}
cout<<endl;
return 0;
}
44. MT1394 元素频次
(1)题目描述
请编写一个简单程序,输入10个整型元素,输出数组中每个元素出现的次数。
格式
输入格式: 输入整型,空格分隔。
.
输出格式: 依次输出元素频次,每个一行。
样例1
输入格式: 9 8 5 0 4 2 1 5 7 1
.
输出格式:
9 1
8 1
5 2
0 1
4 1
2 1
1 2
7 1
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int dp[15],flag[15],cnt=0;
int main( )
{
for(int i=1;i<=10;i++){
cin>>dp[i];
}
for(int i=1;i<=10;i++){
if(flag[i]==1) continue;
cnt=1;
for(int j=i+1;j<=10;j++){
if(dp[i]==dp[j]){
cnt++;
flag[j]=1;
}
}
cout<<dp[i]<<" "<<cnt<<endl;
}
cout<<endl;
return 0;
}
45. MT1395 统计
(1)题目描述
统计一个整型数组中不同元素出现的次数。
格式
输入格式: 第一行输入数组元素个数N为整型,第二行输入元素,如样例所示。
.
输出格式: 输出为整型,前面是元素,后面是出现的次数,每种一行。
样例1
输入格式:
9
1 1 1 1 2 1 3 1 1
.
输出格式:
1 7
2 1
3 1
备注:
N<500
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int dp[15],flag[15],cnt=0;
int main( )
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>dp[i];
}
for(int i=1;i<=n;i++){
if(flag[i]==1) continue;
cnt=1;
for(int j=i+1;j<=n;j++){
if(dp[i]==dp[j]){
cnt++;
flag[j]=1;
}
}
cout<<dp[i]<<" "<<cnt<<endl;
}
cout<<endl;
return 0;
}
46. MT1396 排序吧
(1)题目描述
定义一个长度为n的整型数组,输入n个数组元素的值,然后输出从小到大排序后数组元素。
格式
输入格式: 输入整型,分2行输入。第一行输入n,第二行输入n个数组元素的值,空格分隔
.
输出格式: 输出整型,空格分隔
样例1
输入格式:
5
3 4 2 1 6
.
输出格式: 1 2 3 4 6
备注:
N不大于100
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n,a[100];
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
for(int i=0;i<n;i++) cout<<a[i]<<" ";
return 0;
}
47. MT1397 选择排序
(1)题目描述
输入10个整型元素,对数组进行选择排序,输出从小到大排序后的新数组。
格式
输入格式: 输入整型,空格分隔。
.
输出格式: 输出整型,空格分隔。
样例1
输入格式: 9 8 5 0 4 2 1 5 7 1
.
输出格式: 0 1 1 2 4 5 5 7 8 9
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a[100];
for(int i=0;i<10;i++) cin>>a[i];
sort(a,a+10);
for(int i=0;i<10;i++) cout<<a[i]<<" ";
return 0;
}
48. MT1398 插入排序
(1)题目描述
输入10个整型元素,对数组进行插入排序,输出从小到大排序后的新数组。
格式
输入格式: 输入整型,空格分隔。
.
输出格式: 输出整型,空格分隔。
样例1
输入格式: 9 8 5 0 4 2 1 5 7 1
.
输出格式: 0 1 1 2 4 5 5 7 8 9
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a[100];
for(int i=0;i<10;i++) cin>>a[i];
sort(a,a+10);
for(int i=0;i<10;i++) cout<<a[i]<<" ";
return 0;
}
49. MT1399 冒泡排序
(1)题目描述
输入10个整型元素,对数组进行冒泡排序,输出从小到大排序后的新数组。
格式
输入格式: 输入整型,空格分隔。
.
输出格式: 输出整型,空格分隔。
样例1
输入格式: 9 8 5 0 4 2 1 5 7 1
.
输出格式: 0 1 1 2 4 5 5 7 8 9
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a[100];
for(int i=0;i<10;i++) cin>>a[i];
sort(a,a+10);
for(int i=0;i<10;i++) cout<<a[i]<<" ";
return 0;
}
50. MT1400 快速排序
(1)题目描述
输入10个整型元素,对数组进行快速排序,输出从小到大排序后的新数组。
格式
输入格式: 输入整型,空格分隔。
.
输出格式: 输出整型,空格分隔。
样例1
输入格式: 9 8 5 0 4 2 1 5 7 1
.
输出格式: 0 1 1 2 4 5 5 7 8 9
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a[100];
for(int i=0;i<10;i++) cin>>a[i];
sort(a,a+10);
for(int i=0;i<10;i++) cout<<a[i]<<" ";
return 0;
}
结语
近期会逐步将码题集题库中的新手村600题刷完,预计每天会更新50题,之后会逐步跟进黄金,钻石,星耀,王者的题,尽请期待!!!
同时,也希望这些题能帮助到大家,一起进步,祝愿每一个算法道路上的“苦行僧”们,都能够历经磨难,终成正果,既然选择了这条路,走到了这里,中途放弃,岂不是太过可惜?
另附中国计算机学会的杰出会员、常务理事轩哥博士的B站视频讲解链接https://space.bilibili.com/518554541/?spm_id_from=333.999.0.0,供大家更好的进行学习与刷题~( ̄▽ ̄~)~
愿你的结局,配得上你一路的颠沛流离。