算法竞赛入门码蹄集新手村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)的主要内容,如果未能解决你的问题,请参考以下文章

算法竞赛入门码蹄集新手村600题(MT1401-1450)

算法竞赛入门码蹄集新手村600题(MT1201-1250)

算法竞赛入门码蹄集新手村600题(MT1551-1600)

算法竞赛入门码蹄集新手村600题(MT1101-1150)

算法竞赛入门码蹄集新手村600题(MT1301-1350)

算法竞赛入门码蹄集进阶塔335题(MT2286-2290)