算法竞赛入门码蹄集新手村600题(MT1501-1550)
Posted 灵彧universe
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法竞赛入门码蹄集新手村600题(MT1501-1550)相关的知识,希望对你有一定的参考价值。
算法竞赛入门【码蹄集新手村600题】(MT1501-1550)
@TOC
前言
目录
1. MT1501 字符串转换整数
(1)题目描述
将一个字符串(含数字、符号,长度小于8)转换成整型数,需要考虑符号,如果无法转换(没有数字)则输出结果为FAIL。本题不考虑小数。
格式
样例1
(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。本题不考虑其他进制等情况。
格式
样例1
(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”。
格式
样例1
备注:
(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,否则就输出正面朝上的比率。
格式
样例1
(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中的字符均为大小写字符,且均不相同),找出字符串的所有可能子串数目。
格式
样例1
备注:
(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
(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
(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
(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
格式
样例1
(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个字符。
格式
样例1
(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(由三个不同的小写英语字母组成),把字符串中的元素重新排列组合。
格式
样例1
备注:
(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
(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。
格式
样例1
(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。
格式
样例1
(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)题目描述
定义一个整型变量和指针,让指针指向这个变量,通过指针输出变量的值。
格式
(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
(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
(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
(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
(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
(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)参考代码
#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
(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。
格式
样例1
备注:
(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。
格式
样例1
(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,利用指针遍历并统计字符串中字母的个数并输出。
格式
样例1
(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
备注:
(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)题目描述
利用指针判断字符串是否为回文。(正读和反读都─样的字符串)
格式
样例1
(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,输出新串。
格式
样例1
备注:
(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
(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
(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
(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
(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
(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。
格式
样例1
(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
(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个整数按相反顺序存放。不考虑非法输入。
格式
样例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
(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
(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)。
格式
样例1
备注:
(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。
格式
样例1
(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)题目描述
指针法将数组中奇偶下标的元素分别求和并输出他们的差值(奇下标的和-偶下标的和)。
格式
样例1
备注:
(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)题目描述
小码哥在整理交通违章的信息,他用一个数组记录违章的车牌号,一个数组记录对应的罚金。
请输入日期。如果日期是偶数,罚款从奇数牌号的车辆收取;如果日期是奇数,罚款从偶数牌号的车辆收取。
输出给定日期的罚款总额,用指针实现。不考虑不合理的输入等特殊情况。
格式
样例1
备注:
(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
(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二维数组的列指针,用列指针遍历数组进行输入输出。
格式
样例1
(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),计算二维数组每一行元素乘积之和。
格式
样例1
(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
(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。
格式
样例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;
48. MT1548 矩阵相减
(1)题目描述
输入2个3X3的整型矩阵A和B,编写函数计算A-B,放到矩阵C里面,用指针做参数,输出矩阵C。
格式
样例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的整型数组,编写函数,用指针做参数,输出数组左下角。
格式
样例1
(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
(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题(MT1501-1550)的主要内容,如果未能解决你的问题,请参考以下文章