7-1 矩阵
给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。
输入格式:
输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。
输入样例:
4
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1
输出样例:
35
代码段:
#include <stdio.h>
int main()
{
int n,i,j,sum=0;
scanf("%d",&n);
int a[n][n];
int *p;
p=a[0];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
scanf("%d",p);
p++;
}
for(i=0;i<n;i++)
a[n-1][i]=0;
for(i=0;i<n;i++)
a[i][n-1]=0;
for(i=0;i<n;i++)
{
j=n-i-1;
a[j][i]=0;
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
sum+=a[i][j];
printf("%d",sum);
}
7-2 求矩阵的局部极大值
给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。
输入格式:
输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。
输出格式:
每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。
输入样例1:
4 5
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 1 1 1
输出样例1:
9 2 3
5 3 2
5 3 4
输入样例2:
3 5
1 1 1 1 1
9 3 9 9 1
1 5 3 5 1
输出样例2:
None 3 5
代码段:
#include <stdio.h>
int main()
{
int m,n,i,j,count;
scanf("%d %d\n",&m,&n);
int a[m][n];
int *p;
p=a[0];
for(i=0;i<m*n;i++)
{
scanf("%d",p);
p++;
}
for(i=1;i<m-1;i++)
for(j=1;j<n-1;j++)
{
if(a[i][j]>a[i+1][j]&&a[i][j]>a[i-1][j]&&a[i][j]>a[i][j+1]&&a[i][j]>a[i][j-1])
{
printf("%d %d %d\n",a[i][j],i+1,j+1);
count++;
}
}
if(count==0)
printf("None %d %d",m,n);
}
7-3 构建n阶幻方阵
幻方阵又称魔方阵,是将1~n×n的整数放置在1个n×n的方阵中(n的值为奇数),且保证每行、每列及主对角线、副对角线上的数值之和相等。
本题要求实现n-幻方阵(阶数最大为15),n的值从键盘读入。
N为奇数时,N幻方构造算法为:
(1) 将1放在第一行中间一列;
(2)从2开始直到n×n为止各数依次按下列规则存放:按右上方向行走,即每一个数存放的行比前一个数的行数减1,列数加1。
(3) 如果行列范围超出矩阵范围,则回绕。
(4) 如果按上面规则确定的位置上已有数,则将其放在上一个数的下面。
输入格式:
输入一个正奇数n。
输出格式:
按照样例的格式输出n级幻方阵,每列占4个字符,右对齐。
输入样例:
5
输出样例:
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
代码段:
#include<stdio.h>
int main(){
int n,i,sta,k,chu,kkk=1;
scanf("%d",&n);
int a[n][n];
sta=(n-1)/2;
chu=0;
for(i=0,k=0;i<n*n;i++){
a[chu][sta]=kkk;
kkk++;k++;
if(k==n){
chu=chu+1;
k=0;
continue;//结束此次循环进入下一次
}//此时下一个数输到当前数字的下方
if(chu==0){
chu=n-1;
}//第一行转到最后一行
else chu--;
if(sta==n-1){
sta=0;
}//最后一列提到最前
else sta++;
}
for(i=0;i<n;i++){
for(k=0;k<n;k++){
printf("%4d",a[i][k]);
}
printf("\n");
}
return 0;
}
7-4 组个最小数
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。
现给定数字,请编写程序输出能够组成的最小的数。
输入格式:
输入在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。
输出格式:
在一行中输出能够组成的最小的数。
输入样例:
2 2 0 0 0 3 0 0 1 0
输出样例:
10015558
代码段:
#include<stdio.h>
int main()
{
int a[10],i,j,k;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=1;i<10;i++)
if(a[i]>0)
{
printf("%d",i);
a[i]--;
break;
}
if(a[0]>0)
for(k=0;k<a[0];k++)
printf("0");
for(j=0;j<a[i];j++)
printf("%d",i);
for(i++;i<10;i++)
for(j=0;j<a[i];j++)
printf("%d",i);
printf("\n");
return 0;
}
7-5 字符串排序
本题要求编写程序,读入5个字符串,按由小到大的顺序输出。
输入格式:
输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。
输出格式:
按照以下格式输出排序后的结果:
After sorted:
每行一个字符串
输入样例:
red yellow blue black white
输出样例:
After sorted:
black
blue
red
white
yellow
代码段:
#include <stdio.h>
#include <string.h>
int main()
{
char a[5][80];
char s[80];
int i,j;
for(i=0;i<5;i++)
scanf("%s",a[i]);
for(i=0;i<4;i++)
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(strcmp(a[j],a[j+1])>0)
{
strcpy(s,a[j]);
strcpy(a[j],a[j+1]);
strcpy(a[j+1],s);
}
}
}
printf("After sorted:\n");
for(i=0;i<5;i++)
printf("%s\n",a[i]);
}
7-6 IP地址转换
一个IP地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。
输入格式:
输入在一行中给出32位二进制字符串。
输出格式:
在一行中输出十进制格式的IP地址,其由4个十进制数组成(分别对应4个8位的二进制数),中间用“.”分隔开。
输入样例:
11001100100101000001010101110010
输出样例:
204.148.21.114
代码段:
#include <stdio.h>
int a[8]={128,64,32,16,8,4,2,1};
int main(){
char str[33];
int ans1=0,ans2=0,ans3=0,ans4=0;
scanf("%s",&str);
for(int i=0;i<8;i++){
ans1+=a[i%8]*(str[i]-'0');
}
for(int i=8;i<16;i++){
ans2+=a[i%8]*(str[i]-'0');
}
for(int i=16;i<24;i++){
ans3+=a[i%8]*(str[i]-'0');
}
for(int i=24;i<32;i++){
ans4+=a[i%8]*(str[i]-'0');
}
printf("%d.%d.%d.%d",ans1,ans2,ans3,ans4);
return 0;
}