A - 小泉的难题
Description
机械实验班有个同学叫小泉,有一天数学老师给小泉布置了一道个人作业,给小泉M(M<=100)组数据,每组数据有N个正整数(N<=100)让他把每组的N个数按升序排成一行,但由于数的数目比较多,人工做很费时,于是小泉就想到了喜欢编程序的你,请你帮他解决这个问题,可不要让他失望噢。
Input
输入包括M+1行,第一行是两个正整数M、N;M表示总共多少组数据,下面M行每行包含N个正整数。(输入数据之间会用空格隔开)
Output
输出包括M行,每行分别对应输入中M组数据的升序序列,数与数之间用一个空格隔开。
Sample
Input
2 3 1 3 2 4 2 6
Output
1 2 3 2 4 6
Hint
#include<stdio.h>
int main()
{int m,n,i,j,k;int t;scanf("%d %d",&m,&n);int a[m][n];for(i = 0; i < m; i++){for(j = 0; j < n; j++){scanf("%d",&a[i][j]);}}for(i = 0; i < m; i++){// 外层循环遍历每一行for(j = 1; j < n; j++){// 冒泡排序for(k = 0; k < n - j; k++){if(a[i][k] > a[i][k+1]){t = a[i][k];a[i][k] = a[i][k+1];a[i][k+1] = t;}}}}for(i = 0; i < m; i++){printf("%d",a[i][0]);// 先输出每一行的第一个数for(j = 1; j < n; j++){printf(" %d",a[i][j]);// 每一行剩下的数}printf("\n");// 一行输出完之后就换行}return 0;
}
** 虽然没用指针也能做,但还是写个用指针的吧。。
#include<stdio.h>
int a[110][110];
int (*p)[110] = a;// (*p)[] 是一个数组指针(还是指针,所以必须指向一个数组)
int main()
{int m, n;scanf("%d %d", &m, &n);for(int i = 0; i < m; i++)for(int j = 0; j < n; j++)scanf("%d", &*(*(p+i)+j)); for(int i = 0; i < m; i++){// 遍历每一行for(int j = 0; j < n - 1; j++){for(int k = j+1; k < n; k++){if(*(*(p+i)+k) < *(*(p+i)+j)){int temp = *(*(p+i)+k);*(*(p+i)+k) = *(*(p+i)+j);*(*(p+i)+j) = temp;}}}for(int q = 0; q < n; q++){if(q == n - 1)printf("%d\n", *(*(p+i)+q));elseprintf("%d ", *(*(p+i)+q));}}return 0;
}
B - n个数的排序
Description
LeiQ当上了体育委员,现在老师让他去给班级里的人排队,LeiQ刚学了排序,所以他想以这种方式给班级里的人排队(从矮到高),他想知道排序完成后的结果。
Input
多组输入,每组的第一行是一个正数n(1<=n<=100),第二行是n个数,表示每一个人的高度。
Output
输出排序完成后的结果。
Sample
Input
3 176 175 174
Output
174 175 176
Hint
#include<stdio.h>
int main()
{int n,a[105],i,j,t;while(~scanf("%d",&n)){for(i = 0; i < n; i++)scanf("%d",&a[i]); for(i = 0; i < n - 1; i++){for(j = 0; j < n- 1 - i; j++){if(a[j] > a [j+1]){t = a[j];a[j] = a[j+1];a[j+1] = t;}}}for(i = 0; i < n; i++){if(i == n-1)printf("%d\n",a[i]); elseprintf("%d ",a[i]);}}return 0;
}
**这个题怎么用指针啊?
#include<stdio.h>int a[110];
int *p = a;
int main()
{int n;while(~scanf("%d", &n)){for(int i = 0; i < n; i++)scanf("%d", &*(p+i));for(int i = 0; i < n - 1; i ++){for(int j = 0; j < n - 1 - i; j++){if(*(p+j) > *(p+j+1)){int t = *(p+j);*(p+j) = *(p+j+1);*(p+j+1) = t;}}}for(int i = 0; i < n; i++){if(i == n - 1)printf("%d\n", *(p+i));elseprintf("%d ", *(p+i)); }}return 0;
}
C - C语言实验——矩阵下三角元素之和
Description
输入一个正整数n(1<=n<=10),再输入n*n的矩阵,要求求该矩阵的下三角元素之和。
Input
输入包括n+1行。
第一行为整数n;
接下来的n行为矩阵数据。
Output
矩阵的下三角元素之和。
Sample
Input
51 2 3 4 52 3 4 5 63 4 5 6 74 5 6 7 85 6 7 8 9
Output
75
#include<stdio.h>
int main()
{int a[15][15];int n,i,j,k,sum = 0;scanf("%d",&n);for(i = 0; i < n; i++){for(j = 0; j < n; j++)scanf("%d",&a[i][j]);}for(i = 0; i < n; i++){for(k = 0; k <= i; k++)sum += a[i][k]; }printf("%d\n",sum);return 0;
}
#include<stdio.h>
int f(int (*p)[10],int n)
{int sum = 0;for(int i = 0; i < n; i++){for(int j = 0; j <= i; j++)sum += p[i][j];}return sum;
}
int main()
{int n,i,j,sum;int a[10][10];scanf("%d",&n);for(i=0; i<n; i++){for(j=0; j<n; j++)scanf("%d",&a[i][j]);}sum=f(a,n);printf("%d",sum);return 0;
}
D - 又见回文
Description
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。现在呢,就是让你判断输入的字符串是否是回文串。
Input
有多组输入,每行输入一串字符,保证字符串长度不会大于 100000,字符串由大小写英文字母和空格组成,以字符串“2013”作为结束标志。
Output
每行输出一个字符串,如果输入是回文串,输出“YES”,否则输出“NO”(注意:判断的时候空格是不作判断的,详见样例)。
Sample
Input
aaaaggg glozxvxoMJBCHsTXooXTsHCBJMoxvxzoli am a good acmer2013
Output
YESYESYESNO
Hint
#include<bits/stdc++.h>
using namespace std;
int f(char *a)
{int len=strlen(a);char *p=a,*q=a+len-1;while(p < q){//p为a的首地址,q为a的尾地址if(*q == ' '){//指针q向前移动,如果遇到空格继续减1;q--;continue;}if(*p == ' '){//指针p向后移动,如果遇到空格继续加1;{p++;continue;}if(*q == *p){//如果两个指针代表的字符相等,则向中间同时移动;p++;q--;}elsereturn 0;}return 1;
}int main()
{char a[111000];while(gets(a)){if(strcmp(a,"2013")==0){break;}if(f(a))printf("YES\n");elseprintf("NO\n");}return 0;
}
c:
#include <stdio.h>
#include <string.h>
int f(char *a)
{int len=strlen(a);char *p=a,*q=a+len-1;while(p < q){//p为a的首地址,q为a的尾地址if(*q == ' '){//指针q向前移动,如果遇到空格继续减1;q--;continue;}if(*p == ' '){//指针p向后移动,如果遇到空格继续加1;{p++;continue;}if(*q == *p){//如果两个指针代表的字符相等,则向中间同时移动;p++;q--;}elsereturn 0;}return 1;
}int main()
{char a[111000];while(gets(a)){if(strcmp(a,"2013")==0){break;}if(f(a))printf("YES\n");elseprintf("NO\n");}return 0;
}