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));
else
printf("%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]);
else
printf("%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));
else
printf("%d ", *(p+i));
}
}
return 0;
}
C - C语言实验——矩阵下三角元素之和
Description
输入一个正整数n(1<=n<=10),再输入n*n的矩阵,要求求该矩阵的下三角元素之和。
Input
输入包括n+1行。
第一行为整数n;
接下来的n行为矩阵数据。
Output
矩阵的下三角元素之和。
Sample
Input
5 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8 5 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
aaaa ggg g lozxvxoMJBCHsTXooXTsHCBJMoxvxzol i am a good acmer 2013
Output
YES YES YES NO
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--;
}
else
return 0;
}
return 1;
}
int main()
{
char a[111000];
while(gets(a)){
if(strcmp(a,"2013")==0){
break;
}
if(f(a))
printf("YES\n");
else
printf("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--;
}
else
return 0;
}
return 1;
}
int main()
{
char a[111000];
while(gets(a)){
if(strcmp(a,"2013")==0){
break;
}
if(f(a))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}