7-1 螺旋方阵 (15 分)
所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
输入格式:
输入在一行中给出一个正整数N(<10)。
输出格式:
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。
输入样例:
5
输出样例:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
#include<stdio.h>
int a[100][100];
int main()
{
int n;
scanf("%d",&n);
int t=1;
int x=0,y=0;
a[x][y]=1;
while(n*n>t)
{
while(y+1<n && !a[x][y+1]) a[x][++y] = ++t;
while(x+1<n && !a[x+1][y]) a[++x][y] = ++t;
while(y-1>=0 && !a[x][y-1]) a[x][--y] = ++t;
while(x-1>=0 && !a[x-1][y]) a[--x][y] = ++t;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}
7-2 找最小的字符串 (10 分)
本题要求编写程序,针对输入的N个字符串,输出其中最小的字符串。
输入格式:
输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。
输出格式:
在一行中用以下格式输出最小的字符串:
Min is: 最小字符串
输入样例:
5
Li
Wang
Zha
Jin
Xian
输出样例:
Min is: Jin
#include<stdio.h>
#include<string.h>
struct N{
char Name[81];
}name[1000]; //开始开了100说段错误 开了1000就过了
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",name[i].Name);
}
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(strcmp(name[j].Name,name[j+1].Name)>0)
{
char tempname[100];
strcpy(tempname,name[j].Name);
strcpy(name[j].Name,name[j+1].Name);
strcpy(name[j+1].Name,tempname);
}
}
}
printf("Min is: %s",name[0].Name);
return 0;
}
7-3 英文单词排序 (17 分)
本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。
输入格式:
输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。
输出格式:
输出为排序后的结果,每个单词后面都额外输出一个空格。
输入样例:
blue
red
yellow
green
purple
#
输出样例:
red blue green yellow purple
#include<stdio.h>
#include<string.h>
struct {
char name[50];
}Vocabulary[50];
int main()
{
int Count=0;
while(1)
{
scanf("%s",Vocabulary[Count].name);
if(Vocabulary[Count].name[0]=='#')
break;
Count++;
}
for(int i=0;i<Count-1;i++)
{
for(int j=0;j<Count-i-1;j++)
{
if(strlen(Vocabulary[j].name)>strlen(Vocabulary[j+1].name))
{
char temp[50];
strcpy(temp,Vocabulary[j].name);
strcpy(Vocabulary[j].name,Vocabulary[j+1].name);
strcpy(Vocabulary[j+1].name,temp);
}
}
}
// test printf("%s \n",Vocabulary[0].name);
for(int i=0;i<Count;i++)
{
printf("%s ",Vocabulary[i].name);
}
return 0;
}
7-4 将字符串中数字字符替换成$字符 (10 分)
将字符串中每一个数字字符都替换成一个$字符。
输入格式:
在一行中输入长度小于20的含有数字字符的字符串。在字符串中不要出现换行符,空格,制表符。
输出格式:
直接输出变化后的字符串。
输入样例:
as123rf
输出样例:
as$$$rf
#include<stdio.h>
#include<string.h>
int main()
{
char arr[100];
gets(arr);
int len=strlen(arr);
for(int i=0;i<len;i++)
{
if(arr[i]<=57&&arr[i]>=48)
arr[i]='$';
}
puts(arr);
return 0;
}
7-5 矩阵A乘以B (15 分)
给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有R
a
行、C
a
列,B有R
b
行、C
b
列,则只有C
a
与R
b
相等时,两个矩阵才能相乘。
输入格式:
输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。
输出格式:
若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是B的行数。
输入样例1:
2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8
输出样例1:
2 4
20 22 24 16
53 58 63 28
输入样例2:
3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72
输出样例2:
Error: 2 != 3
nclude<iostream>
#include<stdio.h>
//using namespace std;
int main()
{
int ra,ca,rb,cb;
scanf("%d%d",&ra,&ca);
int a[ra][ca];
for(int i=0;i<ra;i++)
{
for(int j=0;j<ca;j++)
{
scanf("%d",&a[i][j]);
}
}
scanf("%d%d",&rb,&cb);
int b[rb][cb];
for(int i=0;i<rb;i++)
{
for(int j=0;j<cb;j++)
{
scanf("%d",&b[i][j]);
}
}
if(ca!=rb){
printf("Error: %d != %d",ca,rb);
}
else{
printf("%d %d\n",ra,cb);
int c[ra][cb];
for(int i=0;i<ra;i++){
for(int j=0;j<cb;j++){
int sum=0;
for(int k=0;k<ca;k++){
sum+=a[i][k]*b[k][j];
}
if(j<cb-1)
printf("%d ",sum);
else
printf("%d\n",sum);
}
}
}
return 0;
}
7-6 找鞍点 (12 分)
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
输入样例1:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
输出样例1:
2 1
输入样例2:
2
1 7
4 1
输出样例2:
NONE
#include<stdio.h>
int main()
{
int i,j,n,a[6][6],b[6],c[6];
scanf("%d",&n);
for(i=0;i<n;i++)
{
int max=0;
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
if(a[i][j]>max)
{
max=a[i][j];
b[i]=max;
}
}
}
for(j=0;j<n;j++)
{
int min=9999;
for(i=0;i<n;i++)
{
if(a[i][j]<min)
{
min=a[i][j];
c[j]=min;
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(b[i]==c[j])
{
printf("%d %d\n",i,j);
return 0;
}
}
}
puts("NONE");
return 0;
}
7-7 方阵右上三角元素和 (10 分)
求一个5×5数组右上三角(含对角线)元素的和。
输入格式:
输入5行5列的方阵,每行第一个数前没有空格,每行的每个数之间各有一个空格。
输出格式:
直接输出结果。没有其它任何附加字符。
输入样例:
1 2 4 5 8
1 4 7 4 1
1 2 3 6 9
5 6 9 8 4
7 5 3 6 8
输出样例:
74
#include<stdio.h>
#define N 5
int main()
{
int a[20][20];
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
scanf("%d",&a[i][j]);
}
}
int sum=0;
for(int i=0;i<N;i++)
{
for(int j=i;j<N;j++)
{
sum+=a[i][j];
}
}
printf("%d\n",sum);
return 0;
}