目录
写在前面
本文整理了本学习所有的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