首页 > 其他分享 >xdoj-指针类别 题目及参考答案

xdoj-指针类别 题目及参考答案

时间:2024-12-28 10:58:57浏览次数:5  
标签:输出 int 样例 xdoj char ++ 参考答案 输入 指针

目录

写在前面

220

题目

参考答案

231

题目

参考答案

232

题目

参考答案

233

题目

参考答案

235

题目

参考答案

236

题目

参考答案

237

题目

参考答案

470

题目

参考答案

536

题目

参考答案

561

题目

参考答案

660

题目

参考答案

661

题目

参考答案

662

题目

参考答案

663

题目

参考答案

664

题目

参考答案

665

题目

参考答案

666

题目

参考答案


写在前面

本文整理了本学习所有的xdoj指针类别题目,供有需要者学习

220

题目

题目:字符串长度判断

时间限制:1S

内存限制:10000Kb

问题描述:

写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。

输入说明:

输入一个字符串

输出说明:

输出该字符串中元素的个数。

输入样例:

boy

输出样例:

3

参考答案

#include <stdio.h>

#include <stdlib.h>



int main()

{

    char s[100]={'\0'};

    scanf("%s",s);

    char *p = s;

    while(*p++);

    printf("%d",p-1-s);

    return 0;

}

231

题目

试题名称       最长单词的长度

时间限制:      1 秒

内存限制:      256KB

问题描述

给定一个英文句子,统计这个句子中最长单词的长度,并在屏幕上输出。

输入说明

从键盘输入一个英文句子,句子中只含有英文字符和空格,句子以’.’结束。句子总长不超过100个字符。

输出说明

输出一个整数,表示这个句子中最长单词的长度。允许句子中有相同长度的单词。

输入样例

输入样例1

I am a student.

输入样例2

The cat gets a job.

输出样例

输出样例1

7

输出样例2

4

参考答案

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char s[101]={'\0'};
    fgets(s, 101, stdin);
    char *p=s;
    int length = 0 ;
    int max = 0;
    do
    {
        if(*p==' ')
        {
            if(length > max)
            {
                max = length;
            }
            length = 0;
        }
        else
        {
            length++;
        }
    }
    while(*++p!='.');
    if(length > max)
    {
        max = length;
    }
    printf("%d",max);
    return 0;
}

232

题目

试题名称       判断字符串是否是回文

时间限制:      1 秒

内存限制:      256KB

问题描述

给定一个字符串,判断该字符串是否是回文,并在屏幕上输出判断结果。如“abcba”即是回文。

输入说明

从键盘输入一个字符串,该字符串中字符可以是字母、数字和空格,字母区分大小写。字符串总长不超过50个字符。

输出说明

若该字符串是回文,则输出yes,否则输出no。

输入样例

输入样例1

abcba

输入样例2

Abccba

输出样例

输出样例1

yes

输出样例2

no

参考答案

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char s[51]={'\0'};
    scanf("%s",s);
    char *p = s, *q = s;
    while(*++q);
    q--;
    while(p<=q)
    {
        if(*p!=*q)
        {
            printf("no");
            return 0;
        }
        p++;
        q--;
    }
    printf("yes");
    return 0;
}

233

题目

试题名称       字符串部分复制

时间限制:      1 秒

内存限制:      256KB

问题描述

给定一个的字符串,从第m个字符开始复制成为另一个字符串。编写函数copystr( )完成字符串复制,使用字符类型的指针变量作为形参,主函数完成字符串输入和m值的输入,函数调用,以及最后结果的输出。

输入说明

第一行从键盘输入一个字符串,该字符串中字符可以是字母、数字、空格和其它字符。字符串总长不超过50个字符。

第二行输入整数m的值。

输出说明

若该字符串长度小于m,则输出error,否则输出从该字符串第m个字符复制的字符串。

输入样例

输入样例1

Abc ba/!.123

3

输入样例2

abced

6

输出样例

输出样例1

c ba/!.123

输出样例2

error

参考答案

#include <stdio.h>
#include <string.h>

void copystr(char *in,char *out,int m)
{
    in+=m-1;
    do
    {
        *out = *in;
        out++;
    }
    while(*++in);

}

int main()
{
    char s[51]={'\0'},S[51]={'\0'};
    int m;
    fgets(s,51,stdin);
    scanf("%d",&m);
    int n = strlen(s)-1;
    s[n]='\0';
    if(m>n)
    {
        printf("error");
        return 0;
    }
    copystr(s,S,m);

    for(int i = 0;i < n - m + 1;i++)
    {
        putchar(S[i]);
    }
    return 0;
}

235

题目

题目:月份判断

时间限制:1S

内存限制:10000Kb

问题描述:

编写一程序,输入月份号,输出该月的英文月份名,要求用指针数组处理。

输入样例:

3

输出样例:

March

输入样例:

18

输出样例:

wrong

参考答案

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    char s[12][11]={"January","February","March","April","May","June","July","August","September","October","November","December"};
    scanf("%d",&n);
    if(n<=12)
        printf("%s",s[n-1]);
    else
        printf("wrong");

    return 0;
}

236

题目

题目:字符串长度判断(1)

时间限制:1S

内存限制:10000Kb

问题描述:

写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。(注意:必须用指针数组处理)

输入说明:

输入一个字符串

输出说明:

输出该字符串中元素的个数。

输入样例:

boy

输出样例:

3

参考答案

#include <stdio.h>
#include <stdlib.h>
int strLen(char *s)
{
    char *p = s;
    while(*p++);
    return p-s-1;
}

int main()
{
    char s[100]="";
    gets(s);
    int n = strLen(s);
    printf("%d",n);
    return 0;
}

237

题目

题目:字符串复制

时间限制:1S

内存限制:10000Kb

问题描述:

有一个字符串,包含n个字符。写一个函数,将此字符中从第m个字符开始的全部字符复制成为另外一个字符。(注意:必须用指针数组处理)

输入样例:

abcdefg

5

输出样例:

efg

输入样例:

qazxsw

8

输出样例:

error

参考答案

#include <stdio.h>
#include <string.h>

void copy(char *s,int m,char *S);

int main()
{
    char s[100]={'\0'};
    scanf("%s",s);
    int m;
    scanf("%d",&m);
    if(m>strlen(s))
    {
        printf("error");
        return 0;
    }
    char S[100]={'\0'};
    copy(s,m,S);
    int N = strlen(S);
    for(int i = 0;i<N;i++)
        printf("%c",S[i]);
    return 0;
}
void copy(char *s,int m,char *S)
{
    s+=m-1;
    while(*s)
    {
        *S = *s;
        S++;
        s++;
    }

}

470

题目

题目:图形对称性判断

问题描述

  给定一个二维方阵,对应代表一个图形,判断其对称性。请编写五个函数checkHorSym,checkVerSym,checkDiaSym,checkAntiDiaSym,checkRotSym

    分别判断方阵的水平对称性、垂直对称性、对角对称性、反对角对称性、旋转对称性。

    函数声明如下:

int checkHorSym(char **pA, int n);

int checkVerSym(char **pA, int n);

int checkDiaSym(char **pA, int n);

int checkAntiDiaSym(char **pA, int n);

int checkRotSym(char **pA, int n);

返回值:

1表示符合该对称性,0表示不符合该对称性。

参数:

pA:输入参数,输入指向该方阵的二维指针

n:表示该二维方阵的维度为nxn维

#include <stdio.h>
#include <stdlib.h>

int checkHorSym(char **pA, int n);
int checkVerSym(char **pA, int n);
int checkDiaSym(char **pA, int n);
int checkAntiDiaSym(char **pA, int n);
int checkRotSym(char **pA, int n);

int main(void)
{
    int n,i,j,iHorSymFlag=1, iVerSymFlag=1, iDiaSymFlag=1, iAntiDiaSymFlag=1, iRotSymFlag=1;
    char **pA,*pTmp1,*pTmp2;
    scanf("%d", &n);

    pA=(char**) malloc(sizeof(char*)*n);
    for(i=0; i<n; i++)
    {
        pA[i]=(char*) malloc(sizeof(char)*n);
    }
    for(i=0; i<n; i++)
    {
        pTmp1=pA[i];
        for(j=0;j<n;j++)
        {
            scanf("%c", pTmp1);

            while(*pTmp1==' '|| *pTmp1=='\n')//skip spacing or line break
            {
                scanf("%c", pTmp1);
            }
            pTmp1++;
        }
    }



    //horizental symmetry
    iHorSymFlag = checkHorSym(pA, n);

    //vertical symmetry
    iVerSymFlag = checkVerSym(pA, n);

    //diagonal symmetry
    iDiaSymFlag = checkDiaSym(pA, n);


    //antidiagonal symmetry
    iAntiDiaSymFlag = checkAntiDiaSym(pA, n);

    //rotationally symmetry
    iRotSymFlag = checkRotSym(pA, n);

    if(iHorSymFlag)
        printf("1 ");
    if(iVerSymFlag)
        printf("2 ");
    if(iDiaSymFlag)
        printf("3 ");
    if(iAntiDiaSymFlag)
        printf("4 ");
    if(iRotSymFlag)
        printf("5 ");
    printf("\n");

    return 0;
}

主函数输入格式

  输入的第一行包含一个整数n,表示方阵维度,方阵为nxn维。

  第二行开始的n行表示一个方阵,每行包含n个字符a1, a2, …, an,表示给定的方阵,相邻的字符之间用一个空格分隔。

主函数输出格式

  输出一个或多个整数,表示该方阵对应图形的对称性:1代表水平对称,2代表垂直对称,

    3代表对角对称(即以左上到右下的线为对称轴),4代表反对角对称(即以右上到左下的线为对称轴),5代表旋转对称(即以中心位置为轴旋转180°后与原图形重合)。整数之间按照值的大小从小到大排列,以空格隔开。

样例输入

11

0 0 0 0 0 1 0 0 0 0 0

0 0 0 0 1 0 1 0 0 0 0

0 0 0 1 0 0 0 1 0 0 0

0 0 1 0 0 0 0 0 1 0 0

0 1 0 0 0 0 0 0 0 1 0

1 0 0 0 0 0 0 0 0 0 1

0 1 0 0 0 0 0 0 0 1 0

0 0 1 0 0 0 0 0 1 0 0

0 0 0 1 0 0 0 1 0 0 0

0 0 0 0 1 0 1 0 0 0 0

0 0 0 0 0 1 0 0 0 0 0

样例输出

1 2 3 4 5

样例说明

  样例中以0和1两种字符给出了菱形图形,满足所有对称方式。

评测用例规模与约定

1 ≤ n ≤ 100,ai可以是0-9,或者是a-z、A-Z这些字母或数字字符。0

参考答案

int checkHorSym(char **pA, int n)
{
    for(int i = 0;i < n;i++){
        for(int j = 0;j < n/2;j++)
        {
            if(pA[i][j] != pA[i][n-j-1])
                return 0;
        }
    }
    return 1;
}
int checkVerSym(char **pA, int n)
{
    for(int j = 0;j < n;j++){
        for(int i = 0;i < n/2;i++)
        {
            if(pA[i][j] != pA[n-i-1][j])
                return 0;
        }
    }
    return 1;
}
int checkDiaSym(char **pA, int n)
{
    for(int i = 0; i < n;i++){
        for(int j = 0; j < i;j++){
            if(pA[i][j] != pA[j][i])
                return 0;
        }
    }
    return 1;
}
int checkAntiDiaSym(char **pA, int n)
{
    for(int i = 0; i < n;i++){
        for(int j = 0; j < n-1-i;j++){
            if(pA[i][j] != pA[n-1-j][n-1-i])
                return 0;
        }
    }
    return 1;
}
int checkRotSym(char **pA, int n)
{
    for(int i = 0; i < n;i++){
        for(int j = 0; j < n;j++){
            if(pA[i][j] != pA[n-1-i][n-1-j])
                return 0;
        }
    }
    return 1;
}

536

题目

void paint(int, int (*)[4], int *);

返回值:函数无返回值。

参数:

参数1:整型变量,表示输入矩形的个数。

参数2:二维整型数组,第2维表示输入矩形的序号,第1维4个元素依次表示矩形左下角横坐标、左下角纵坐标、右上角横坐标和右上角纵坐标。

参数3:一维整型数组,表示统计结果,按照降序,第1个元素存放染色次数,下一个元素存放相同染色次数的单元格数目,以此类推。

主函数输入说明:

输入的第一行包含一个整数n,表示要画的矩形的个数,1<=n<=100

接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。0<=横坐标、纵坐标<=100。

主函数输出说明:

输出n行整数对,按照降序输出被染色次数,以及相应的单元格数目,同行两个整数之间用1个空格分隔。

主函数输入样例:

2

1 1 4 4

2 3 6 5

主函数输出样例:

2 2

1 13

0 9985

参考答案

#include<stdio.h>

void paint(int, int (*)[4], int *);

int main()
{
	int n,l[100][4];//Store coordinates
	int result[300];
	int i;

	scanf("%d",&n);

	for(i=0;i<n;i++)
	{
		scanf("%d%d%d%d",&l[i][0],&l[i][1],&l[i][2],&l[i][3]);
	}

	paint(n,l,result);//statistic
	for(i=0;i<=result[0];i++)
	{
		printf("%d %d\n",result[i*2],result[i*2+1]);
	}

	return 0;
}
void paint(int n, int L[][4], int *result)
{
    int count[101]={0};
    int array[100][100]={0};
    for(int i = 0;i<n;i++)
    {
        int x_1 = L[i][0],y_1 = L[i][1],x_2 = L[i][2],y_2 = L[i][3];
        for(int x = x_1;x < x_2;x++){
            for(int y = y_1;y < y_2;y++){
                array[x][y]++;
            }
        }
    }
    for(int x = 0;x < 100;x++){
        for(int y = 0;y < 100;y++){
            count[array[x][y]]++;
        }
    }
/*wrong*/ 
//    int *p=count;
//    int max;
//    while(*++p);//terminate in the intermediate 0;
//    max = p-count-1;

    int max = 0;//寻找最大被染色次数
    for (int x = 0; x < 100; x++) {
        for (int y = 0; y < 100; y++) {
            if(array[x][y] > max){
                max = array[x][y];
            }
        }
    }

    for(int i = max,index = 0;i >= 0 ;i--)
    {
        result[index++]=i;
        result[index++]=count[i];
    }
}


561

题目

题目:构造新字符串

问题描述

从键盘输入一个字符串,然后按照下面要求输出一个新字符串。新串是在原串中每两个

字符之间插入一个空格,如原串为abcd,则新串为a b c d。要求使用指针。

输入格式

输入一个字符串

输出格式

输出一个新字符串,新串是在原串中每两个字符之间插入一个空格。

样例输入

abcd

样例输出

a b c d

评测用例规模与约定

1≤strlen(s)≤100。

参考答案

#include <stdio.h>
#include <string.h>

int main()
{
    char s[101]="";
    gets(s);

    char S[201]="";
    char *p = s, *q = S;

    while(*p)
    {
        *q++=*p++;
        *q++=' ';
    }
    puts(S);
    return 0;
}

660

题目

                                查找书籍

给定n本书的名称和定价,输出这n本书中定价最高和最低的书的名称及定价。

下面程序将n本书的名称和定价保存在结构体数组中,函数find_max_min的功能是在该数

组中找出定价最高和最低的书所对应的下标,请编写并提交函数find_max_min的定义。

#include <stdio.h>
#define N 100
typedef struct{
    char name[81];
    double price;
}Book;

void  find_max_min(Book bk[], int n , int *max_idx , int *min_idx);

int main()
{
    int n;
    scanf("%d",&n);
    getchar();

    Book bk[N];

    int i;
    for(i=0;i<n;i++){
        gets(bk[i].name);
        scanf("%lf",&bk[i].price);
        getchar();
    }

    int max_idx=0,min_idx=0;
    find_max_min(bk,n,&max_idx, &min_idx);

    printf("%.2lf, %s\n",bk[max_idx].price,bk[max_idx].name);
    printf("%.2lf, %s\n",bk[min_idx].price,bk[min_idx].name);

    return 0;
}

输入格式:

输入第一行给出正整数n(<100),随后给出n本书的信息。每本书在一行中给出书名(长

度为不超过80的字符串),随后一行中给出该书的价格(正实数)。题目保证没有同样价格

的书。

输出格式:

在一行中按照“价格, 书名”的格式先后输出价格最高和最低的书。价格保留2位小数。

输入样例:

4

Programming in C

21.5

C++ Primer(5th Edition)

65.0

Introduction to Algorithms, Fourth Edition

98.0

Probabilistic Machine

74.5

输出样例:

98.00, Introduction to Algorithms, Fourth Edition

21.50, Programming in C

参考答案

void  find_max_min(Book bk[], int n , int *max_idx , int *min_idx)
{
    *max_idx = 0;*min_idx = 0;
    double max = bk[0].price, min = bk[0].price;
    for(int i = 1; i < n;i++)
    {
        if(bk[i].price > max){
            max = bk[i].price;
            *max_idx = i;
        }else if(bk[i].price < min){
            min = bk[i].price;
            *min_idx = i;
        }
    }
}

661

题目

问题描述

对于一个整数数列(包含 n 个杂乱无章的整数),编写数程序完成各个元素求和,以及

最大值位置查询任务,位置编码与数组下标一致。

要求与说明:

输入格式

第一行输入正整数 n(n 不大于 20),表示数列元素个数。

第二行输入 n 个整数(绝对值不大于 100 的整数)。

输出格式

输出和、最大值和位置(编码为数组下标,从0计),数据以一个空格分隔。

样例输出 1:

-61 38 2

样例输入 2:

7

33 57 47 19 41 62 84

样例输出 2:

343 84 6

样例输入 3:

4

-53 -36 -29 -45

样例输出 3:

-163 -29 2

样例说明

数列各个元素互不相同,可以是正数、0、负数。

评测用例规模与约定

数列元素绝对值不大于 100。

参考答案

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    scanf("%d",&n);
    int *array = (int*)malloc(n*sizeof(int));
    for(int i = 0;i < n;i++)
        scanf("%d",&array[i]);

    int sum = array[0];
    int max = array[0];
    int max_index = 0;
    for(int i = 1;i < n;i++)
    {
        sum+=array[i];
        if(max < array[i]){
            max = array[i];
            max_index = i;
        }
    }
    printf("%d %d %d",sum,max,max_index);
    return 0;
}

662

题目

题目:字母排序

问题描述

编写程序完成一个字符串中位于奇数位置的字符的转换和排序任务。要求:

1.)对于处于奇数位置(编号与数组下标一致)的小写字母,转换为大写字母,其它字

符不变。

2.)仅对处于奇数位置的大写字母升序排序,其它字符不变。

输入格式

第一行输入正整数 n(n 小于 100,表示字符串长度)。

第二行输入字符串(包括大小写字母、数字和空格,长度为 n)。

输出格式

输出处理后的字符串。

样例输入 1:

10

2a T87m tr

样例输入 2:

6

a3udqn

样例输入 3:

7

33 tdft

样例输出 1:

2A R87m tT

样例输出 2:

a3uDqN

样例输出 3:

33 FdTt

样例说明

字符串包含字母、数字和空格。

评测用例规模与约定

编号与数组下标一致。

参考答案

#include <stdio.h>
#include <stdlib.h>
void bubble_sorting_ascending(char a[],int n);//ascending
int main()
{
    int n;
    scanf("%d",&n);
    getchar();
    char *str = (char*)malloc(sizeof(char)*(n+1)) ;
    if(str)
    {
        fgets(str,n+1,stdin);
        str[n]='\0';
        for(int i=1;i<n;i+=2)
        {
            if('a'<=str[i]&&str[i]<='z')
                str[i]-=32;
        }
        bubble_sorting_ascending(str,n);
        for(int i = 0;i<n;i++)
        {
            printf("%c",str[i]);
        }

    }
    else
    {
        printf("error");
    }
    free(str);
    return 0;
}
void bubble_sorting_ascending(char a[],int n)//ascending
{
    int change = 1;
    while(change)
    {
        change = 0;
        for(int i = 1;i < n-2;i+=2)
        {
            if('A'<=a[i]&&a[i]<='Z'){
                char next='\0';int next_i;
                for(int j = 2;i+j < n;j+=2)
                    if('A'<=a[i+j]&&a[i+j]<='Z'){
                        next = a[i+j];
                        next_i = i+j;
                        break;
                    }
                if(!next)
                    break;
                if(a[i] > next)
                {
                    int t = a[i];    a[i] = next;  a[next_i] = t;
                    change = 1;
                }
            }
        }
    }
}

663

题目

题目:删除特定值

问题描述

对于一个正整数数列,编程完成下述任务:

1.)删除数列中所有等于参考值 m 的数。

2.)其余数字依次前移。

输入格式

第一行输入一个正整数数列(各个元素均不大于50,以一个空格分隔,个数小于 30 个)。

第二行输入待删除正整数参考值 m(m 不大于 50)。

输出格式

输出处理后的数列,数据以一个空格分隔。

样例输入 1:

1 5 3 7 7 5 7 3 7 1

7

样例输入 2:

11 21 31 11 31 22 31 21 11

31

样例输入 3:

8 8 8 4 6 8 8 8

8

样例输出 1:

1 5 3 5 3 1

样例输出 2:

11 21 11 22 21 11

样例输出 3:

4 6

样例说明

数列各个元素为正整数,数值均不大于 50。

评测用例规模与约定

参考值不大于 50。

参考答案

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[30]={0};
    int n;
    for(int i = 0;i<30;i++)
    {
        scanf("%d",&a[i]);
        if(getchar()=='\n'){
            n = i+1;
            break;
        }
    }
    int m;
    scanf("%d",&m);
    for(int i = 0;i<n;i++)
    {
        if(a[i]!=m)
            printf("%d ",a[i]);
    }


    return 0;
}

664

题目

题目:相似度

问题描述

编写程序完成两个字符串相似度的计算任务。

相似度:对于两个字符串,相同字符串的最大长度 L(忽略大小写),len1、len2 分别

为两个字符串的长度,相似度 LCS=2*L/(len1+len2)。(字符串长度均小于 100,由大小写

字母构成)。

输入格式

第一行输入字符串A。

第二行输入字符串 B。

输出格式

输出计算结果,保留 3 位小数。

样例输入 1:

asdup

asd

样例输入 2:

ManyPencil

manyp

样例输入 3:

threetreethere

reetr

样例输出 1:

0.750

样例输出 2:

0.667

样例输出 3:

0.526

样例说明

字符串均由大小写字母构成,长度小于 100。

评测用例规模与约定

字符串可以完全相同、部分相同,也可以完全不同。

参考答案

#include <stdio.h>
#include <stdlib.h>
#include <string.h>



int main()
{
    char s1[100] = "";
    char s2[100] = "";
    //gets(s1);
    //gets(s2);
    fgets(s1,100,stdin);fgets(s2,100,stdin);

    int n1 = strlen(s1),n2 = strlen(s2),maxL = 0,L = 0;
    if(s1[n1-1]=='\n'){
        n1--;
        s1[n1]='\0';
    }
    if(s2[n2-1]=='\n'){
        n2--;
        s2[n2]='\0';
    }
    for(int i = 0;i < n1;i++)
    {
        if('A' <= s1[i] && s1[i] <= 'Z')
            s1[i] += 'a'-'A';
    }
    for(int i = 0;i < n2;i++)
    {
        if('A' <= s2[i] && s2[i] <= 'Z')
            s2[i] += 'a'-'A';
    }

    for(int i = 0;i < n1;i++)
    {
        for(int j = 0;j < n2;j++)
        {
            char *p = &s1[i];
            char *q = &s2[j];
            L = 0;
            while(*p && *q && *p==*q)
            {
                p++;q++;L++;
            }
            if(L > maxL)
                maxL = L;
        }
    }

    float LCS = (2.0*maxL)/(n1+n2);
    printf("%.3f",LCS);
    return 0;
}

665

题目

题目:之型降序排序

问题描述

    编写程序对一个包含M×N个数据的一维数列,按照之字形降序排列任务。

要求与说明:

    1.)按照M×N矩阵形式排序的之字形,正整数M、N分别表示矩阵的行数和列数。

    2.)矩阵各个元素均为10以内的个位正整数。

    3.)使用指向一维数列的指针完成排序任务。

输入格式

    第一行输入正整数M、N(均属于[2,8]内的自然数)。

    后续M行,每行输入N个个位正整数。

输出格式

    按矩阵形式输出处理结果,元素之间以一个空格分隔。

样例输入1:

5 2

8 3

9 5

8 6

9 1

7 0

样例输出1:

9 9

8 8

7 6

3 5

1 0

样例输入2:

3 6

7 9 8 2 6 4

9 1 7 2 0 5

3 0 6 8 3 5

样例输出2:

9 9 8 8 7 7

3 4 5 5 6 6

3 2 2 1 0 0

样例输入3:

4 3

2 5 7

8 3 9

5 6 1

2 1 0

样例输出3:

9 8 7

5 5 6

3 2 2

0 1 1

样例说明

    矩阵各个元素排列不规律。

评测用例规模与约定

    各个元素均为两位正整数。

参考答案

#include <stdio.h>
#include <stdlib.h>

int main()
{
    short M,N;
    scanf("%hd%hd",&M,&N);
    short * array = (short*)malloc(M*N*sizeof(short));
    short n = M*N;
    for(int i = 0;i < n;i++)
        scanf("%hd",&array[i]);
//    short ** arr = (short**)malloc(M*sizeof(short*));本来想定义二维的,突然发现一维更方便
//    for(int i = 0;i < M;i++)
//        arr[i] = (short *)malloc(N*sizeof(short));
//    for(int i = 0;i < M;i++)
//        for(int j = 0;j < N;j++)
//            scanf("%hd",&arr[i][j]);
    short exchange = 1;
    while(exchange)
    {
        exchange = 0;
        for(int i = 0;i < n-1;i++)
        {
            if(array[i]<array[i+1])
            {
                exchange = 1;
                short temp = array[i];array[i] = array[i+1];array[i+1] = temp;
            }
        }
    }
    for(int i = 0;i < M;i++)
    {
        if(i%2)
        {
            for(int j = N-1;j >= 0;j--)
            {
                printf("%hd ",array[i*N+j]);
            }
            printf("\n");
        }
        else
        {
            for(int j = 0;j < N;j++)
            {
                printf("%hd ",array[i*N+j]);
            }
            printf("\n");
        }
    }
    return 0;
}

666

题目

题目:M 形升序排序

问题描述

编写数程序对一个包含 M×N 个数据的一维数列,按照 M 字形升序排列任务。要求

与说明:

1.)按照 M×N 矩阵形式排序的 M 字形,正整数 M、N 分别表示矩阵的行数和列数。

2.)矩阵各个元素均为 10 以内的个位正整数。

输入格式

第一行输入正整数 M、N(均属于[2,8]内的自然数)。

后续 M 行,每行输入N 个个位正整数。

输出格式

按矩阵形式输出处理结果,元素之间以一个空格分隔。

样例输入 1:

3 5

8 5 7 3 9

3 9 5 8 6

8 5 9 5 1

样例输出 1:

3 5 7 8 9

3 5 6 8 9

1 5 5 8 9

样例输入 2:

2 6

9 7 8 2 3 1

6 4 2 3 8 9

样例输出 2:

2 2 4 6 8 9

1 3 3 7 8 9

样例输入 3:

4 3

2 8 7

9 3 7

5 6 2

9 1 9

样例输出 3:

3 5 9

2 6 9

2 7 9

1 7 8

样例说明

数列各个元素排列不规律。

评测用例规模与约定

各个元素均为个位正整数。

参考答案

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int m,n;
    scanf("%d%d",&m,&n);
    int **array = (int **)malloc(m*sizeof(int*));
    for(int i = 0;i < m;i++)
        array[i] = (int *)malloc(n*sizeof(int));
    for(int i = 0;i < m;i++)
        for(int j = 0;j < n;j++)
            scanf("%d",&array[i][j]);
    int *a = (int *)malloc(m*n*sizeof(int));
    int index = 0;
    for(int j = 0;j < n;j++)
    {
        if(j%2)
        {
            for(int i = m-1;i >= 0;i--)
                a[index++] = array[i][j];
        }
        else
        {
            for(int i = 0;i < m;i++)
                a[index++] = array[i][j];
        }
    }
    short exchange = 1;
    while(exchange)
    {
        exchange = 0;
        for(int i = 0;i < index-1;i++)
        {
            if(a[i]>a[i+1])
            {
                exchange = 1;
                int t = a[i];a[i] = a[i+1];a[i+1] = t;
            }
        }
    }


	int x = 0;
	for(int j = 0; j < n; j++) {
		if(j % 2){
			for(int i = 0; i < m ; i++)
				array[i][j] = a[x++];
		}else{
			for(int i = m - 1; i >= 0; i--)
				array[i][j] = a[x++];
		}
	}

    for(int i = 0;i < m;i++){
        for(int j = 0;j < n;j++)
            printf("%d ",array[i][j]);
        putchar('\n');
    }

    free(a);
    for(int i = 0;i < m;i++)
        free(array[i]);
    free(array);
    return 0;
}

标签:输出,int,样例,xdoj,char,++,参考答案,输入,指针
From: https://blog.csdn.net/Komorebi_awa/article/details/144783473

相关文章

  • 《c和指针》第17章 经典抽象数据类型
    第17章经典抽象数据类型17.1内存分配在实现抽象数据类型(ADT)时,内存分配是一个关键问题。对于复杂的数据结构,如堆栈、队列和树,需要动态分配内存来存储数据元素。在C语言中,通常使用malloc、calloc和realloc函数来进行动态内存分配。malloc函数用于分配指定字节数的内......
  • 《c和指针》第15章 输入/输出函数
    第15章输入/输出函数15.1错误报告在进行输入/输出操作时,可能会发生各种错误,如文件不存在、磁盘已满等。C语言提供了一些机制来报告这些错误,以便程序员能够及时处理。errno是一个全局变量,定义在<errno.h>头文件中。当一个函数发生错误时,它通常会设置errno来指示错误......
  • 《c和指针》第14章 预处理器
    第14章预处理器14.1预定义符号预处理器在编译之前会对源代码进行处理,它识别一些预定义符号,这些符号提供了有关编译环境和源文件的信息。常见的预定义符号有:__LINE__:当前源代码文件中的行号,是一个整数常量。在调试时,它可以帮助定位代码中的错误位置。例如:#include<std......
  • rust学习十五.1、智能指针基本概念
    本文没有什么需要特别详细阐述的内容,基本都是一些基础性的概念和一些空洞的定义。一、基本概念指针-拥有一个指向一个堆数据的地址的变量。本身是变量,但其数据就是一个地址。智能指针-一种特别的指针(也是变量),除了指向数据的地址,通常还具有元数据和其它功能。智能指针通常使......
  • 定义了鼠标指针放在一个元素边界范围内时所用的光标形状
    值描述url需使用的自定义光标的URL。注释:请在此列表的末端始终定义一种普通的光标,以防没有由URL定义的可用光标。default默认光标(通常是一个箭头)auto默认。浏览器设置的光标。crosshair光标呈现为十字线。pointer光标呈现为指示链接的指针(一只手)move此光标指示某对象可......
  • 116. 填充每个节点的下一个右侧节点指针
    题目链接解题思路:其实就是在层序遍历的过程中,把next指针填上代码classSolution:defconnect(self,root:'Optional[Node]')->'Optional[Node]':ifroot==None:returnNone#层序遍历的过程中,填好nextqueue=deque()......
  • C++杂记02 指针
    好久没有更新推文了,最近换了工作,时间相对多了一点,有一点时间把过去的一些笔记内容给整理一下。能坚持学习和整理是一件很难的事情,当下大多数人的生活都相当碎片化,很多事做着做着就中断了,希望我能把我学习C++和OpenFOAM的一些内容写完。指针在OpenFOAM里面是一个很常见的内容,例如......
  • C++ 杂记03 指针(二) 智能指针
    C++中,智能指针与普通指针不同,是包含指针的一种类模板,用于管理动态分配的内存。智能指针的行为类似于常规指针,但是能够自动地释放所指向的对象,避免内存的泄露。智能指针通过对被引用对象进行计数的方式,或者其他机制,限制被引用的次数,避免形成循环引用。相较于常规指针,在使用完以后,......
  • c语言期末复习----指针
    一、指针基础知识1指针概念:指针是一个值为内存地址的变量2格式:指针在使用前一定要有明确指向(初始化)1)先声明再初始化 2)声明的同时初始化 inta,*p=&a;注:关于指针p的三个相关的值1)p,p里面存放着一个地址2)*p,p指向的对象的值3)&p,表示变量p本身的地址3*的作用1)定义指......
  • 丢手绢(尺取法/快慢指针)
    题目:链接:https://ac.nowcoder.com/acm/problem/207040题意:n个小朋友围成一个圈,给你这n个小朋友之间的距离,请你求出这些小朋友中隔得最远的两个之间的距离。(距离取逆时针距离与顺时针距离的最小值)思路:可以将这些小朋友围成的圈看作一个圆,把小朋友看作一个一个圆弧上距离不......