算法竞赛入门【码蹄集新手村600题】(MT1501-1550)
前言
为什么突然想学算法了?
> 用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。
> 但从实际而言,是因为当下快到了考研和找工作的年纪(ಥ_ಥ),无论走哪一条路,都不免需要一些相对丰富的算法知识,是故,便产生了一个暑假速成算法的计划,可能对于像我这种算法竞赛小白而言,几乎很难,但我仍然还是想尝试一下,毕竟,梦想还是要有的,万一实现了呢?~( ̄▽ ̄~)~
为什么选择码蹄集作为刷题软件?
码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC) 指导下建设的,其依托全国各大名校计算机系和清华大学出版社等单位的强大资源,旨在为计算机学习爱好者提供全面和权威的计算机习题。
目录
1. MT1501 字符串转换整数
(1)题目描述
将一个字符串(含数字、符号,长度小于8)转换成整型数,需要考虑符号,如果无法转换(没有数字)则输出结果为FAIL。本题不考虑小数。
格式
输入格式: 输入字符串,第一个字符为+或者-
.
输出格式: 输出为整型(整数不用输出+号)
样例1
输入格式: -123
.
输出格式: -123
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAX_NUM 10005
#define PI 3.1415926
double res;
int ans,n,m,t,k,len,cnt=0,minn=MAX_NUM,maxx=0;
char ch,s1[MAX_NUM] = "",s2[MAX_NUM]="";
bool flag = true;
int a[MAX_NUM] = {0} , b[MAX_NUM] = {0};
int main(){
cin.getline(s1,MAX_NUM);
len = strlen(s1);
if(len==1){
cout << "FAIL" << endl;
} else {
n = atoi(s1);
cout << n << endl;
}
return 0;
}
2. MT1502 字符串转换浮点数
(1)题目描述
将一个数字字符串(不超过正常double范围)转换成浮点型数,需要考虑是否有正负符号开头、是否有且只有一个小数点,如果是非法的数结果为0。本题不考虑其他进制等情况。
格式
输入格式: 输入字符串(长度小于80)
.
输出格式: 输出为浮点型。非法数据输出0。
样例1
输入格式: -123.5
.
输出格式: -123.500000
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[80];
cin.getline(a,80);
double ret = 0;
int flag;
if(a[0]=='+') flag = 1;
if(a[0]=='-') flag = -1;
bool flag2 = false;
int cnt = 1;
int j = (a[0] == '+'||a[0]=='-' ? 1:0);
for(int i = j; i < strlen(a); i++) {
if((a[i]>'9' || a[i]<'0')&&a[i]!='.'){
ret = 0;
break;
}
if(a[i]=='.' && flag2 == true){
ret = 0;
break;
}
if(a[i] == '.' && flag2 == false){
flag2 = true;
continue;
}
if(!flag2){
ret = ret*10 + a[i] - '0';
}else {
ret = ret * 10 + a[i] - '0';
cnt *= 10;
}
}
if(ret == 0) printf("0");
else printf("%lf",ret/cnt*flag);
return 0;
}
3. MT1503 中心对称
(1)题目描述
编写程序,输入一个字符串,判断一个字符串是否中心对称,如“AAXAA”。
格式
输入格式: 输入字符串
.
输出格式: 输出为YES或者NO
样例1
输入格式: AAXAA
.
输出格式: YES
备注:
字符串中可能含有空格。
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
char a[80];
cin.getline(a,80);
double ret = 0;
int flag;
if(a[0]=='+') flag = 1;
if(a[0]=='-') flag = -1;
bool flag2 = false;
int cnt = 1;
int j = (a[0] == '+'||a[0]=='-' ? 1:0);
for(int i = j; i < strlen(a); i++) {
if((a[i]>'9' || a[i]<'0')&&a[i]!='.'){
ret = 0;
break;
}
if(a[i]=='.' && flag2 == true){
ret = 0;
break;
}
if(a[i] == '.' && flag2 == false){
flag2 = true;
continue;
}
if(!flag2){
ret = ret*10 + a[i] - '0';
}else {
ret = ret * 10 + a[i] - '0';
cnt *= 10;
}
}
if(ret == 0) printf("0");
else printf("%lf",ret/cnt*flag);
return 0;
}
4. MT1504 抛银币
(1)题目描述
小码哥无聊做抛银币实验,输入U表示正面朝上,D表示反面朝上,S表示立在桌上,输入由这3个字符组成的字符串表示抛银币的结果。如果有至少一次银币立在桌子上就输出WA,否则就输出正面朝上的比率。
格式
输入格式: 输入字符串(长度小于1000)
.
输出格式: 输出实型
样例1
输入格式: UUUDDD
.
输出格式: 0.500000
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char coins[1000];
int u = 0, d=0,s=0;
cin.getline(coins,1000);
int len = strlen(coins);
for(int i=0;i<len;i++){
if(coins[i]=='S'){
s++;
break;
}
else if(coins[i]=='U') u++;
else if(coins[i]=='D') d++;
}
if(s==1) printf("WA");
else printf("%f", 1.0*u/len);
return 0;
}
5. MT1505 字符串子集
(1)题目描述
输入字符串s(s中的字符均为大小写字符,且均不相同),找出字符串的所有可能子串数目。
格式
输入格式: 输入字符串s1(长度小于50)
.
输出格式: 输出子串总数
样例1
输入格式: ABC
.
输出格式: 6
备注:
如果字符串为ABC,则其所以子串为
A
B
C
AB
BC
ABC
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAX_NUM 10005
#define PI 3.1415926
double res;
int ans,n,m,t,k,len,cnt=0,minn=MAX_NUM,maxx=0;
char ch,s1[MAX_NUM] = "",s2[MAX_NUM]="";
bool flag = true;
int a[MAX_NUM] = {0} , b[MAX_NUM] = {0};
int main( )
{
cin.getline(s1,MAX_NUM);
len = strlen(s1);
cout << len*(len+1) / 2 << endl;
return 0;
}
6. MT1506 查找子串
(1)题目描述
输入1个字符串包含1,2,3三种字符的字符串,每一次你可以将其中一个数字改成任意另一个,求需要多少次才能将整个字符串改成同样的数字。
格式
输入格式: 输入1个字符串,长度为n (n<100000)
.
输出格式: 最少需要修改的次数
样例1
输入格式: 123123123
.
输出格式: 6
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char s[100000];
int cnt[3];
cin.getline(s,100000);
int len = strlen(s);
for(int i = 0;i < len; i++)
cnt[s[i]-'1']++;
int ans = 0;
for(int i = 0;i < 3;i++){
ans = max(cnt[i],ans);
}
printf("%d",len-ans);
return 0;
}
7. MT1507 最长的1
(1)题目描述
输入1个字符串包含1,2,3三种字符的字符串,在其中找到长度最长的,全部是1的子串,输出其长度。
格式
输入格式: 输入1个字符串,长度为n (n<100000)
.
输出格式: 最长的全部是1的字串的长度
样例1
输入格式: 12112311123
.
输出格式: 3
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char s[100000];
cin.getline(s,100000);
int len = strlen(s);
int ans = 0;
int cnt = 0;
for(int i = 0;i < len;i++)
{
if(s[i] == '1')
cnt++;
else
{
ans = max(ans,cnt);
cnt = 0;
}
}
ans = max(ans,cnt);
printf("%d",ans);
return 0;
}
8. MT1508 查找子串1
(1)题目描述
输入1个字符串其中包含一个字符串“zichuan”,输出它在字符串的起止位置(从0开始)。
如果子串多次出现,查找第一次出现的位置。如果没有包含该子串,输出NULL。
格式
输入格式: 输入1个字符串,长度为n (n<100000)
.
输出格式: 字符串的开始和结尾的位置
样例1
输入格式: asdzichuanqewr
.
输出格式: 3 9
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char a[100000];
char zi[] = "zichuan";
cin.getline(a, 100000);
char * begin = strstr(a,zi);
if(begin == NULL) cout << "NULL";
else {
int i = begin - a;
cout << i << " " <<i + strlen(zi) - 1;
}
return 0;
}
9. MT1509 查找子串2
(1)题目描述
输入2个字符串其中,第一个字符串可能包含第二个字符串。输出其第一次出现位置,若不存在,则输出-1
格式
输入格式: 输入2个字符串,长度均小于100
.
输出格式: 字符串的开始的位置
样例1
输入格式:
asdzichuanqewr
zichuan
.
输出格式: 3
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char a[100];
char b[100];
cin.getline(a, 100);
cin.getline(b, 100);
char* begin = strstr(a,b);
if(begin == NULL) cout << "-1";
else cout << begin-a;
return 0;
}
10. MT1510 子串比较
(1)题目描述
输入字符串(长度小于80)S1,S2,如果在字符串S1中找到跟S2相同的子串则输出YES,没有输出NO。要求子串长度最少含2个字符。
格式
输入格式: 分两行输入字符串S1,S2
.
输出格式: 输出YES或者NO
样例1
输入格式:
Wendy hate C++!
C++
.
输出格式: YES
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char a[80];
char b[80];
cin.getline(a,80);
cin.getline(b,80);
char*begin = strstr(a,b);
if(begin == NULL) cout << "NO";
else cout<<"YES";
return 0;
}
11. MT1511 字符串组合
(1)题目描述
输入字符串s1(由三个不同的小写英语字母组成),把字符串中的元素重新排列组合。
格式
输入格式: 输入字符串s1
.
输出格式: 输出字典序最小的一种新的组合
样例1
输入格式: xyz
.
输出格式: xzy
备注:
xyz的所有排列按字典序递增如下:
xyz
xzy
yxz
yzx
zxy
zyx
因为最小的序列xyz与原字符串一样,不是新的,所以我们输出xzy
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
string s1,s2;
cin >> s1;
s2 = s1;
sort(s1.begin(),s1.end());
if(s1==s2)
cout << s1[0] << s1[2] << s1[1];
else
cout << s1;
return 0;
}
12. MT1512 左右排序
(1)题目描述
将一个字符串以中心位置,左半部分按升序排列,右半部分逆序。若字符串长度是奇数,则中间字符不动。
格式
输入格式: 输入字符串
.
输出格式: 输出字符串
样例1
输入格式: fsad123
.
输出格式: afsd321
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
bool cmp(int a, int b)
{
return a>b;
}
int main( )
{
char a[80];
cin.getline(a,80);
int len = strlen(a);
if(len%2==1){
sort(a,a+len/2);
sort(a+len/2+1,a+len,cmp);
}else{
sort(a,a+len/2);
sort(a+len/2,a+len,cmp);
}
cout << a;
return 0;
}
13. MT1513 编号排序
(1)题目描述
输入n个字符串,是所有产品的编号,求按照字典序排序的编号。
编号的总长度量不超过1e6。
格式
输入格式: 一个整数n (n<100000),接下来有n行,包含n个编号
.
输出格式: 排序后的编号
样例1
输入格式:
3
qwerty
asdfgh
qwer
.
输出格式:
asdfgh
qwer
qwerty
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
string s[100000];
int n;
scanf("%d\n",&n);
for(int i = 0; i < n;i++)
getline(cin,s[i]);
sort(s,s+n);
for(int i = 0; i < n; i++)
cout << s[i] << endl;
return 0;
}
14. MT1514 最长的编号
(1)题目描述
输入n个字符串,是所有产品的编号,求按照编号长度排序的编号。长度相同的编号按照字典序排列。
编号的总长度量不超过1e6。
格式
输入格式: 一个整数n (n<100000),接下来有n行,包含n个编号
.
输出格式: 排序后的编号
样例1
输入格式:
3
qwerty
asdfgh
qwer
.
输出格式:
qwer
asdfgh
qwerty
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
bool cmp(string a,string b){
if(a.length()==b.length())
return a<b;
else if (a.length()<b.length())
return true;
else return false;
}
int main( )
{
string s[100000];
int n;
scanf("%d\n",&n);
for(int i = 0; i<n ;i++)
getline(cin,s[i]);
sort(s,s+n,cmp);
for(int i=0;i<n;i++)
cout<<s[i]<<endl;
return 0;
}
15. MT1515 整型变量和它的指针
(1)题目描述
定义一个整型变量和指针,让指针指向这个变量,通过指针输出变量的值。
格式
输入格式: 输入整型
.
输出格式: 输出整型样例1
输入格式: 3
.
输出格式: 3
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a,*p;
scanf("%d",&a);
p = &a;
printf("%d",*p);
return 0;
}
16. MT1516 用指针交换两个数
(1)题目描述
编写一个程序,输入2个整数,用指针指向他们,交换他们的值后输出。
格式
输入格式: 输入整型,空格分隔
.
输出格式: 输出整型,空格分隔
样例1
输入格式: 3 5
.
输出格式: 5 3
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
void swap(int *pa,int *pb){
int temp;
temp = *pa;
*pa = *pb;
*pb = temp;
}
int main( )
{
int a, b, temp;
scanf("%d%d",&a,&b);
swap(&a,&b);
printf("%d %d",a,b);
return 0;
}
17. MT1517 顺序输出
(1)题目描述
编写一个程序,输入3个整数,用指针方法指向他们,将它们按由小到大的顺序输出。
格式
输入格式: 输入整型,空格分隔
.
输出格式: 输出整型,空格分隔
样例1
输入格式: 3 5 1
.
输出格式: 1 3 5
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
void swap(int *pa,int *pb){
int temp;
temp = *pa;
*pa = *pb;
*pb = temp;
}
int main( )
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a>b)
swap(&a,&b);
if(a>c)
swap(&a,&c);
if(b>c)
swap(&b,&c);
printf("%d %d %d",a,b,c);
return 0;
}
18. MT1518 用指针交换
(1)题目描述
输入3个整数a,b,c,编写一个交换函数,用指针做参数,将它们按由小到大的顺序放到a,b,c中再输出。
格式
输入格式: 输入整型,空格分隔
.
输出格式: 输出整型,空格分隔
样例1
输入格式: 7 3 2
.
输出格式: 2 3 7
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
void swap(int *pa,int *pb){
int temp;
temp = *pa;
*pa = *pb;
*pb = temp;
}
int main( )
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a>b)
swap(&a,&b);
if(a>c)
swap(&a,&c);
if(b>c)
swap(&b,&c);
printf("%d %d %d",a,b,c);
return 0;
}
19. MT1519 实型指针
(1)题目描述
定义一个实型变量和指针,让指针指向这个变量,通过指针输出变量的值。
格式
输入格式: 输入实型
.
输出格式: 输出实型
样例1
输入格式: 3.4
.
输出格式: 3.400000
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
double a,*p;
scanf("%lf",&a);
p = &a;
printf("%lf",*p);
return 0;
}
20. MT1520 字符型指针
(1)题目描述
定义一个字符型变量和指针,让指针指向这个变量,通过指针输出变量的值。
格式
输入格式: 输入字符型
.
输出格式: 输出字符型
样例1
输入格式: M
.
输出格式: M
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char a, *p;
scanf("%c",&a);
p = &a;
printf("%c",*p);
return 0;
}
21. MT1521 指向字符串的指针
(1)题目描述
定义一个指向一个字符串的指针,输入字符串,然后输出第n个元素。
格式
输入格式: 第1行输入字符串,第2行输入整数n
.
输出格式: 输出字符型
样例1
输入格式:
I love coding
3
.
输出格式: 1
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char a[80],*p;
int n;
p = a;
cin.getline(a, 80);
scanf("%d",&n);
printf("%c",p[n-1]);
return 0;
}
22. MT1522 指向字符串的指针
(1)题目描述
编写函数f(char *s),将字符串s中的大写字母加3,小写字母减3。
格式
输入格式: 输入字符串
.
输出格式: 输出字符串
样例1
输入格式: DEFdef
.
输出格式: GHIabc
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
void f(char * s){
while(*s){
if(*s >= 'a' && *s <= 'z') *s -=3;
if(*s >= 'A' && *s <= 'Z') *s +=3;
s++;
}
}
int main( )
{
char s[100];
cin.getline(s,100);
f(s);
printf("%s",s);
return 0;
}
23. MT1523 字符串复制
(1)题目描述
利用指针完成字符串复制函数char mycpy(char s1,char *s2),把S2的内容复制到s1串中,再输出s1。
格式
输入格式: 输入两行,分别为字符串S1和S2
.
输出格式: 输出字符串S1
样例1
输入格式:
C++
C is great!
.
输出格式: C is great!
备注:
字符串长度小于10000
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
char *mycpy(char *s1,char *s2){
char *p = s1;
while(*s2 != '\0')
*(p++) = *(s2++);
*p = '\0';
return s1;
}
int main( )
{
char str1[10000],str2[10000];
cin.getline(str1, 10000);
cin.getline(str2, 10000);
mycpy(str1,str2);
cout<<str1;
return 0;
}
24. MT1524 字符串连接
(1)题目描述
利用指针完成字符串连接函数char mystrcat(char s1,char *s2),把s2的内容连接到s1串后面,再输出s1。两个字符串长度均小于5000。
格式
输入格式: 分两行输入字符串s1,s2
.
输出格式: 输出字符串s1
样例1
输入格式:
I love C!
C is great!
.
输出格式: I love C!C is great!
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
char *mystrcat(char *s1,char *s2) {
char *p = s1;
while(*p !='\0')
p++;
while(*s2!='\0')
*(p++) = *(s2++);
*p = '\0';
return s1;
}
int main( )
{
char s1[10000] ="",s2[5000] = "";
cin.getline(s1, 10000);
cin.getline(s2, 5000);
mystrcat(s1, s2);
cout<<s1;
return 0;
}
25. MT1525 计数
(1)题目描述
输入字符串s1,利用指针遍历并统计字符串中字母的个数并输出。
格式
输入格式: 输入字符串S1
输出格式: 输出整型
样例1
输入格式: I love C!C is great!
.
输出格式: 14
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char str[10000] = "";
char *p = str;
int cnt=0;
cin.getline(str,10000);
while(*p != '\0')
if(isalpha(*(p++)))
cnt++;
cout << cnt;
return 0;
}
26. MT1526 字符频次
(1)题目描述
输入字符串s1,用指针指向这个字符串,查找字符串中重复字符(区分大小写),依次输出他们和他们出现的频次。
格式
输入格式: 输入字符串
.
输出格式: 输出字符和频次,空格分隔。
样例1
输入格式: Wendy is a great girl
.
输出格式:
e 2
i 2
a 2
g 2
r 2
备注:
输出字符,按照原字符串中的排序顺序
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char s1[10000];
cin.getline(s1,10000);
char *p =s1;
for(int i=0;i<strlen(s1);i++){
if(*(p+i)==' ')
continue;
int num = 1;
for(int j= i+1; j < strlen(s1);j++){
if(*(p+i) == *(p+j)){
num++;
*(p+j) = ' ';
}
}
if(num >= 2){
printf("%c %d\n",*(p+i),num);
}
}
return 0;
}
27. MT1527 回文串
(1)题目描述
利用指针判断字符串是否为回文。(正读和反读都─样的字符串)
格式
输入格式: 输入字符串
.
输出格式: 输出YES或者NO
样例1
输入格式: wenew
.
输出格式: YES
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
char str[10000] = "";
char *p1,*p2;
bool state = true;
cin.getline(str, 10000);
p1=str;
p2=str+strlen(str)-1;
while (p1 < p2){
if(*p1 != *p2){
state = false;
break;
}
p1++;
p2--;
}
if(state)
cout << "YES";
else
cout << "NO";
return 0;
}
28. MT1528 插入字符
(1)题目描述
输入字符串s1,整数N和字符c,用指针指向这个字符串,在位置N插入字符c,输出新串。
格式
输入格式: 第一行输入字符串,第二行输入整数N和字符c,空格分隔。
.
输出格式: 输出字符串
样例1
输入格式:
Wendy i great
7 s
.
输出格式: Wendy is great
备注:
位置N插入字符c,指的是下标N处放字符c,其他字符相应后移一位。字符串长度小于700。
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
void insert(char *s,char ch,int pos){
char *p = s+strlen(s);
*(p+1) = '\0';
while(p > s+pos){
p--;
*(p+1) = *p;
}
*p = ch;
return;
}
int main( )
{
char str[700] = "";
char ch;
int pos;
cin.getline(str,700);
cin>>pos>>ch;
insert(str,ch,pos);
cout << str;
return 0;
}
29. MT1529 统计子串
(1)题目描述
统计一个字符串出现某子串的次数。
格式
输入格式: 第一行输入字符串,第二行输入子串。
.
输出格式: 输出字符串
样例1
输入格式:
aabsdfjslaadkk
aa
.
输出格式: 2
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int match(char *s1,char *s2){
int ans = 0;
int len = strlen(s2);
while(*s1){
for(int i = 0;i<len;i++){
if(*(s1+i) != *(s2+i))
break;
if(i==len-1)
ans++;
}
s1++;
}
return ans;
}
int main( )
{
char s1[100],s2[100];
cin.getline(s1,100);
cin.getline(s2,100);
printf("%d\n",match(s1,s2));
return 0;
}
30. MT1530 最大等值子串
(1)题目描述
若一个字符串的一个子串的每个字符均相同,则称为等值子串。求一个字符串的最大等值子串的长度。
格式
输入格式: 一行:一串字符串。
.
输出格式: 一行:最长等值字串的个数。
样例1
输入格式: 1223334444
.
输出格式: 4
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int maxLen(char *s){
int len = strlen(s);
int ret = 1;
int cnt = 1;
for (int i = 1; i < len; i++){
if(*(s+i) == *(s+i-1)) cnt++;
else cnt = 1;
ret = max(ret,cnt);
}
return ret;
}
int main( )
{
char s[100];
cin.getline(s,100);
printf("%d",maxLen(s));
return 0;
}
31. MT1531 指针做函数参数
(1)题目描述
编写函数将参数s所指字符串中除了下标为奇数,同时ASCII值也为奇数的字符之外,其余所有字符都删除。
格式
输入格式: 输入字符串
.
输出格式: 输出字符串
样例1
输入格式: 0123456789
.
输出格式: 13579
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
void fun(char *str) {
char s[100];
int j = 0, n = strlen(str);
for(int i = 1;i < n; i =i+2)
if(str[i] % 2 != 0)
s[j++] = str[i];
s[j] = '\0';
int len = strlen(s);
for(int i = 0; i < len; i++)
str[i] = s[i];
str[len] = '\0';
}
int main( )
{
char str[100];
cin.getline(str, 100);
fun(str);
printf("%s",str);
return 0;
}
32. MT1532 通配符
(1)题目描述
编写函数实现通配符的匹配,其中通配符为“?”,表示匹配任意一个字符,若匹配成功返回字符串的匹配位置(起始为0)。如“there”和“?re”是匹配的,返回2。若匹配失败,返回-1。
格式
输入格式: 第一行为原字符串,第二行为目标字符串
.
输出格式: 返回匹配的下标位置,失败返回-1。
样例1
输入格式:
there
?re
.
输出格式: 2
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int match(char *s1, char *s2){
int len1=strlen(s1), len2=strlen(s2);
for(int i = 0;i < len1; i++){
for(int j = 0;j < len2;j++){
if(s2[j]!='?' && s1[i+j] != s2[j]) break;
if(j==len2-1) return i;
}
}
return -1;
}
int main( )
{
char s1[100],s2[100];
cin.getline(s1, 100);
cin.getline(s2,100);
printf("%d",match(s1,s2));
return 0;
}
33. MT1533 指向一维数组的指针
(1)题目描述
定义一个指向一维数组的指针,用指针遍历数组进行输入输出。数组含10个数组元素。
格式
输入格式: 输入整型
.
输出格式: 输出整型
样例1
输入格式: 1 2 3 4 5 6 7 8 9 10
.
输出格式: 1 2 3 4 5 6 7 8 9 10
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a[10],*p;
p=a;
for(int i = 0;i <10; i++)
scanf("%d",&p[i]);
for(int i = 0;i < 10; i++)
printf("%d ",p[i]);
return 0;
}
34. MT1534 指针递增
(1)题目描述
编写一个使用指针递增方式访问数组a的元素的程序。数组长度为3,数组元素为1,2,3。
格式
输入格式: 无
.
输出格式: 分行输出数组a的元素,数组为整型
样例1
输入格式: 无
.
输出格式:
a[0]=1
a[1]=2
a[2]=3
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a[3] = {1,2,3};
int *ptr;
ptr = a;
for(int i = 0;i < 3; i ++){
printf("a[%d]=%d\n",i,*ptr);
ptr++;
}
return 0;
}
35. MT1535 间隔插入
(1)题目描述
定义一个指向一维数组的指针,从键盘上输入10个数组元素,按后原来数组中,每两个元素之间插入一个1,输出新数组。
格式
输入格式: 输入数组元素,整型,空格分隔。
.
输出格式: 输出整型,空格分隔。
样例1
输入格式: 1 2 3 4 5 6 7 8 9 10
.
输出格式: 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a[10];
for(int i = 0;i<10;i++){
cin >> a[i];
}
for(int *i = a;i != &a[10];i++){
cout << *i << " ";
if(i!=&a[9]) cout << 1 <<" ";
}
return 0;
}
36. MT1536 指针逆序
(1)题目描述
指针法将数组A中n个整数按相反顺序存放。不考虑非法输入。
格式
输入格式: 输入为整型,第一行输入正整数n,第二行输入数组元素,空格分隔。
.
输出格式: 输出为整型,空格分隔。
样例1
输入格式:
5
1 4 5 2 0
.
输出格式: 0 2 5 4 1
备注:
n不大于10
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
void reverse(int *a,int n){
for(int i=0;i<n/2;i++){
int temp = a[i];
a[i] = a[n-i-1];
a[n-i-1] = temp;
}
}
int main()
{
int a[10];
int n;
scanf("%d",&n);
for(int i = 0;i < n;i++) scanf("%d",a+i);
reverse(a, n);
for(int i = 0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
37. MT1537 用指针逆序输出数组
(1)题目描述
定义一个指向一维数组的指针,用指针遍历数组并逆序输出。数组含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[10];
for(int i = 0; i < 10; i++)
cin >> a[i];
for(int *i = &a[9]; i != a-1;i--)
cout << *i << ' ';
return 0;
}
38. MT1538 用指针间隔输出数组
(1)题目描述
定义一个指向一维数组的指针,用指针遍历数组并从第一个元素开始间隔地输出。数组含10个数组元素。
格式
输入格式: 输入数组元素,整型,空格分隔。
.
输出格式: 输出整型,空格分隔。
样例1
输入格式: 1 2 3 4 5 6 7 8 9 10
.
输出格式: 1 3 5 7 9
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a[10];
for(int i = 0; i < 10; i++)
cin >> a[i];
for(int *i = a; i != &a[10]; i = i+2)
cout << *i << " ";
return 0;
}
39. MT1539 中心对称
(1)题目描述
用指针法判断数组是否中心对称,如 (1,2,3,5,3,2,1)。
格式
输入格式:第一行输入数组长度N(>=1),第二行输入数组元素,整型,空格分隔。
.
输出格式: 输出YES或者NO
样例1
输入格式:
7
1 2 3 5 3 2 1
.
输出格式: YES
备注:
数组不超过10个元素
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a[10];
int n;
scanf("%d",&n);
for(int i = 0;i < n;i++) scanf("%d", a+i);
for(int i = 0; i < n/2; i++){
if(*(a+i) != *(a+n-i-1)){
printf("NO");
return 0;
}
}
printf("YES");
return 0;
}
40. MT1540 奇偶和
(1)题目描述
数组中有N个数字(数字之和不超过int范围),用指针指向这个数组,检查下标为奇数的数字之和是否等于下标为偶数的数字之和,输出YES或者NO。
格式
输入格式: 第一行输入数组长度N,第二行输入数组元素(下标从0开始),整型,空格分隔。
.
输出格式: 输出为YES或者NO
样例1
输入格式:
3
1 2 3
.
输出格式: NO
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a[100], n;
int *p = a;
cin >> n;
int even = 0, odd = 0;
for(int i = 0; i< n;i++) cin>>*(p+i);
for(int i = 0; i< n; i++){
if(i%2 == 1)
odd += *(p+i);
else
even += *(p+i);
}
if(odd ==even)
cout << "YES";
else
cout << "NO";
return 0;
}
41. MT1541 指针求和
(1)题目描述
指针法将数组中奇偶下标的元素分别求和并输出他们的差值(奇下标的和-偶下标的和)。
格式
输入格式: 输入为整型,第一行输入n,第二行输入数组元素,空格分隔。
.
输出格式: 输出为整型,空格分隔。
样例1
输入格式:
5
1 4 5 2 0
.
输出格式: 0
备注:
数组不超过10个元素
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n,dp[1005];
cin >>n;
for(int i=0;i<n;i++){
cin>>dp[i];
}
int *p,ji=0,ou=0;
p=dp;
for(int i=0;i<n;i++){
if(i%2==0) ou+=*(p+i);
else ji+=*(p+i);
}
cout<<ji-ou<<endl;
return 0;
}
42. MT1542 违章
(1)题目描述
小码哥在整理交通违章的信息,他用一个数组记录违章的车牌号,一个数组记录对应的罚金。
请输入日期。如果日期是偶数,罚款从奇数牌号的车辆收取;如果日期是奇数,罚款从偶数牌号的车辆收取。
输出给定日期的罚款总额,用指针实现。不考虑不合理的输入等特殊情况。
格式
输入格式: 第一行输入数组长度N和日期M,第二行输入车牌数组的元素,第三行输入罚金的数组的元素。空格分隔,整型。
.
输出格式: 输出整型
样例1
输入格式:
4 6
1115 1112 2135 1334
450 500 150 200
.
输出格式: 600
备注:
N不大于10
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n,m,dp[1005]={0},bucket[1005]={0},ans=0;
cin>>n>>m;
for(int i=0;i<n;i++) cin>>dp[i];
for(int i=0;i<n;i++) cin>>bucket[i];
int *p1 = dp,*p2=bucket;
if(m%2==0){
for(int i=0;i<n;i++){
if(*p1%2==1) ans+=*p2;
p1++,p2++;
}
}else{
for(int i=0;i<n;i++){
if(*p1%2==0) ans+=*p2;
p1++,p2++;
}
}
cout<<ans<<endl;
return 0;
}
43. MT1543 二维数组行指针
(1)题目描述
定义一个指向3X3二维数组的行指针,用行指针遍历数组进行输入输出。
格式
输入格式: 输入整型
.
输出格式: 输出整型
样例1
输入格式: 1 2 3 4 5 6 7 8 9
.
输出格式:
1 2 3
4 5 6
7 8 9
(2)参考代码
/**
使用1级指针访问二维数组
因为数组本身在地址空间中就是连续排列的,根据行数和列数,
计算出访问单元的 地址偏移量 就可以用一级指针遍历二维数组中的所有数据。
*/
#include<stdio.h>
void printMatirx(int *pArray,int rows,int cols);
int main()
{
int array[3][3],i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
scanf("%d",&array[i][j]);
}
}
int *pArray = NULL;
pArray = array;
printMatirx(array,3,3);//打印2行3列的数组
return 0;
}
void printMatirx(int *pArray,int rows,int cols)
{
int i;
int j;
for(i=0;i<rows;i++)
{
for(j=0;j< cols;j++) {
printf("%d ", *(pArray + i * cols + j));//访问i行j列的二维数组元素
}
printf("\n");
}
}
44. MT1544 二维数组列指针
(1)题目描述
定义一个指向4X4二维数组的列指针,用列指针遍历数组进行输入输出。
格式
输入格式: 输入整型
.
输出格式: 输出整型,格式%2d
样例1
输入格式: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
.
输出格式:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int dp[1005][1005]={0};
int main( )
{
int *p;
for(p=dp[0];p<dp[0]+16;p++) cin>>*p;
for(p=dp[0];p<dp[0]+16;p++){
printf("%2d ",*p);
if((p-dp[0])%4==3){
cout<<endl;
}
}
return 0;
}
45. MT1545 行元素乘积
(1)题目描述
用一维数组指针访问二维数组(MXN),计算二维数组每一行元素乘积之和。
格式
输入格式: 第一行输入正整数M和N,第二行输入数组元素,整型,空格分隔。
.
输出格式: 输出整型
样例1
输入格式:
3 2
1 2
3 5
3 2
.
输出格式: 23
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
int ans=0,m,n,dp[1005][1005];
int main( )
{
cin>>m>>n;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++) cin>>dp[i][j];
}
for(int i=0;i<m;i++){
int now=1;
for(int *p = &dp[i][0]; p!=&dp[i][n];p++){
now = now*(*p);
}
ans += now;
}
cout<<ans<<endl;
return 0;
}
46. MT1546 矩阵转置
(1)题目描述
写一个函数,用指针做参数,将3×3矩阵转置。
格式
输入格式: 按矩阵形式输入数组元素,整型,空格分隔。
.
输出格式: 输出整型,按矩阵形式输出。
样例1
输入格式:
1 2 3
4 5 6
7 8 9
.
输出格式:
1 4 7
2 5 8
3 6 9
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
void change(int *a,int *b){
int f;
f = *a;
*a = *b;
*b = f;
}
void zhuanzhi(int (*a)[5]){
change(*(a+1)+2,*(a+2)+1);
change(*(a+1)+3,*(a+3)+1);
change(*(a+2)+3,*(a+3)+2);
}
int main( )
{
int a[5][5];
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++) cin>>a[i][j];
}
zhuanzhi(a);
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++) cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
47. MT1547 矩阵相加
(1)题目描述
输入2个3X3的整型矩阵A和B,编写函数计算A+B,放到矩阵C里面,用指针做参数,输出矩阵C。
格式
输入格式: 分两行输入两个矩阵,空格分隔。
.
输出格式: 按矩阵形式输出,整型,每个数字占3列,空格分隔。
样例1
输入格式:
1 2 3 8 7 6 6 4 3
0 7 5 4 3 5 2 1 4
.
输出格式:
1 9 8
12 10 11
8 5 7
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
void matrixPlus(int (*a)[3],int (*b)[3]){
int c[3][3];
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
*(*(c+i)+j) = *(*(a+i)+j) + *(*(b+i)+j);
if(j==0) printf("%3d",*(*(c+i)+j));
else printf(" %3d",*(*(c+i)+j));
}
printf("\n");
}
}
int main( )
{
int a[3][3],b[3][3];
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
scanf("%d",&b[i][j]);
}
}
matrixPlus(a, b);
return 0;
}
48. MT1548 矩阵相减
(1)题目描述
输入2个3X3的整型矩阵A和B,编写函数计算A-B,放到矩阵C里面,用指针做参数,输出矩阵C。
格式
输入格式: 分两行输入两个矩阵,空格分隔。
.
输出格式: 按矩阵形式输出,整型,每个数字占3列,空格分隔。
样例1
输入格式:
1 2 3 8 7 6 6 4 3
0 7 5 4 3 5 2 1 4
.
输出格式:
1 -5 -2
4 4 1
4 3 -1
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
void matrixPlus(int (*a)[3],int (*b)[3]){
int c[3][3];
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
*(*(c+i)+j) = *(*(a+i)+j) - *(*(b+i)+j);
if(j==0) printf("%3d",*(*(c+i)+j));
else printf(" %3d",*(*(c+i)+j));
}
printf("\n");
}
}
int main( )
{
int a[3][3],b[3][3];
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
scanf("%d",&b[i][j]);
}
}
matrixPlus(a, b);
return 0;
}
49. MT1549 左下角
(1)题目描述
输入3X3的整型数组,编写函数,用指针做参数,输出数组左下角。
格式
输入格式: 输入数组,元素在0到9之间,空格分隔。
.
输出格式: 输出数组,空格分隔。
样例1
输入格式: 1 2 3 4 5 6 7 8 9
.
输出格式:
1
4 5
7 8 9
(2)参考代码
#include<bits/stdc++.h>
using namespace std;
void lower_left(int(*a)[1005]){
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(j<=i){
if(j==0) cout<<*(*(a+i)+j);
else cout<<" "<<*(*(a+i)+j);
}
}
cout<<endl;
}
}
int main( )
{
int a[1005][1005];
for(int i=0;i<3;i++){
for(int j=0;j<3;j++) cin>>a[i][j];
}
lower_left(a);
return 0;
}
50. MT1550 十二月
(1)题目描述
编一个程序,输入月份数,输出该月的名称,小写,要求用指针处理。不考虑非法输入等特殊情况。
格式
输入格式:输入整型
.
输出格式: 输出字符串
样例1
输入格式: 4
.
输出格式: april
(2)参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string month[12] = {"january","february","march","april","may","june","july","august","september","october","november","december"};
string *ptr = month;
int n;
cin >> n;
cout << *(ptr+n-1);
return 0;
}
结语
近期会逐步将码题集题库中的新手村600题刷完,预计每天会更新50题,之后会逐步跟进黄金,钻石,星耀,王者的题,尽请期待!!!
同时,也希望这些题能帮助到大家,一起进步,祝愿每一个算法道路上的“苦行僧”们,都能够历经磨难,终成正果,既然选择了这条路,走到了这里,中途放弃,岂不是太过可惜?
另附中国计算机学会的杰出会员、常务理事轩哥博士的B站视频讲解链接https://space.bilibili.com/518554541/?spm_id_from=333.999.0.0,供大家更好的进行学习与刷题~( ̄▽ ̄~)~
愿你的结局,配得上你一路的颠沛流离。