admin 管理员组

文章数量: 1184232


2024年2月18日发(作者:div class form group)

1.逆序存放数组中的数据,并输出指定元素

本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按要求输出指定的数组元素。

输入格式:

在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。第三行输入一个非负整数m(m

输出格式:

在一行中输出逆序存放后下标为m的数组元素。行末无空格。

输入样例:

6

10 8 1 2 3 4

2

输出样例:

2

(1)编程思路。

要将数组a中的n个元素逆序,只需将a[0]与a[n-1]、a[1]与a[n-2]、…、a[i]与a[n-1-i]交换即可,这样的交换共进行n/2组。采用一个简单的一重循环来完成。

for (int i=0;i

{

int t=a[i];

a[i]=a[n-1-i];

a[n-1-i]=t;

}

(2)源程序。

#include

int main ()

{

int n,m;

scanf("%d",&n);

int a[10];

int i;

for (i=0;i

scanf("%d",&a[i]);

for (int i=0;i

{

int t=a[i];

a[i]=a[n-1-i];

a[n-1-i]=t;

}

scanf("%d",&m);

printf("%dn",a[m]);

return(0);

}

2.交换最小值和最大值

本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。

注意:题目保证最大和最小值都是唯一的。

输入格式:

输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。

输出格式:

在一行中顺序输出交换后的序列,每个整数后跟一个空格。

输入样例:

5

8 2 5 1 4

输出样例:

1 2 5 4 8

(1)编程思路。

在数组中找最大值和最小值的方法是:先认为第1个元素a[0]的值既是最大值也是最小值,即max=min=0(注意:此处保留的是最大值与最小值的下标)。之后用循环对剩下的N-1个元素进行遍历。若元素a[i]比最大值a[max]大,更新最大值下标max;若元素a[i]比最小值a[min]小,更新最小值下标min。

找到最大值下标max和最小值下标min后,按要求进行元素交换即可。

(2)源程序。

#include

#include

int main ()

{

int n;

scanf("%d",&n);

int a[10];

int i;

for (i=0;i

scanf("%d",&a[i]);

int mini=0,maxi=0;

for (i=1;i

{

if (a[mini]>a[i]) mini=i;

if (a[maxi]

}

int t;

t=a[0]; a[0]=a[mini]; a[mini]=t;

if (maxi==0) maxi=mini;

t=a[n-1]; a[n-1]=a[maxi]; a[maxi]=t;

for (int i=0;i

printf("%d ",a[i]);

printf("n");

return(0);

}

3.简化的插入排序

本题要求编写程序,将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。

输入格式:

输入在第一行先给出非负整数N(<10);第二行给出N个从小到大排好顺序的整数;第三行给出一个整数X。

输出格式:

在一行内输出将X插入后仍然从小到大有序的整数序列,每个数字后面有一个空格。

输入样例:

5

1 2 4 5 7

3

输出样例:

1 2 3 4 5 7

(1)编程思路。

要将整数x插入到有序序列a[0]~a[n-1]中,采用如下的循环找到一个插入位置并插入x即可。找插入位置时,从后往前找,若当前元素值大于x,则该元素向后移,留出插入的位置。

for (i=n-1;i>=0;i--)

{

if (a[i]>x) a[i+1]=a[i];

else break;

}

a[i+1]=x;

(2)源程序。

#include

#include

int main ()

{

int n;

scanf("%d",&n);

int a[11];

int i;

for (i=0;i

scanf("%d",&a[i]);

int x;

scanf("%d",&x);

for (i=n-1;i>=0;i--)

{

if (a[i]>x) a[i+1]=a[i];

else break;

}

a[i+1]=x;

for (int i=0;i<=n;i++)

printf("%d ",a[i]);

printf("n");

return(0);

}

4.求整数序列中出现次数最多的数

本题要求统计一个整型序列中出现次数最多的整数及其出现次数。

输入格式:

输入在一行中给出序列中整数个数N(0

输出格式:

在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的。

输入样例:

10 3 2 -1 5 3 4 3 0 3 2

输出样例:

3 4

(1)编程思路。

定义数组 int a[1000];保存输入的N个整数,先用冒泡排序对数组a按从小到大的顺序排序,这样,相同的整数在数组中一定连续存放。

为求得出现次数最多的整数ansnum及其出现次数ans,对数组a进行遍历。

初始时,置ans=1,ansnum=a[0],num=a[0],cnt=1;,表示a[0]出现次数最多,次数为1,当前数num为a[0],有cnt=1个。

之后用一重循环 for (i=1;i

若 a[i]==num,表示当前数又出现一次,计数cnt++;

若a[i]!=num,当前数num不会再出现了,若num出现的次数最多,更新出现次数最多的整数ansnum=num及其出现次数ans=cnt;之后置num=a[i],cnt=1,a[i]称为新的当前数,出现了1次。

(2)源程序。

#include

#include

int main ()

{

int n;

scanf("%d",&n);

int a[1000];

int i,j,t;

for (i=0;i

scanf("%d",&a[i]);

for (i=0;i

for (j=0;j

if (a[j]>a[j+1])

{

t=a[j]; a[j]=a[j+1]; a[j+1]=t;

}

int ans=1,ansnum=a[0],num=a[0],cnt=1;

for (i=1;i

if (a[i]!=num)

{

if (ans

{

ans=cnt; ansnum=num;

}

cnt=1;

num=a[i];

}

else

cnt++;

if (ans

{

ans=cnt; ansnum=num;

}

printf("%d %dn",ansnum,ans);

return(0);

}

5.查询水果价格

给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。

首先在屏幕上显示以下菜单:

[1] apple

[2] pear

[3] orange

[4] grape

[0] exit

用户可以输入编号1~4查询对应水果的单价。当连续查询次数超过5次时,程序应自动退出查询;不到5次而用户输入0即退出;输入其他编号,显示价格为0。

输入格式:

输入在一行中给出用户连续输入的若干个编号。

输出格式:

首先在屏幕上显示菜单。然后对应用户的每个输入,在一行中按格式“price = 价格”输出查询结果,其中价格保留两位小数。当用户连续查询次数超过5次、或主动输入0时,程序结束。

输入样例1:

3 -1 0 2

输出样例1:

[1] apple

[2] pear

[3] orange

[4] grape

[0] exit

price = 4.10

price = 0.00

输入样例2:

1 2 3 3 4 4 5 6 7 8

输出样例2:

[1] apple

[2] pear

[3] orange

[4] grape

[0] exit

price = 3.00

price = 2.50

price = 4.10

price = 4.10

price = 10.20

(1)编程思路。

定义数组 double price[5]={0.00,3.00,2.50,4.10,10.20};保存四种水果的价格,其中price[i]保存第i种(i=1~4)水果的价格。

定义数组int a[5]保存输入的最多5次查询,对每次查询a[i],若a[i]为1~4之一,则对应输出price[a[i]];否则输出0.00。

(2)源程序。

#include

int main ()

{

int x,n=0;

int a[5];

while (1)

{

scanf("%d",&x);

if (x==0) break;

a[n++]=x;

if (n==5) break;

}

printf("[1] applen[2] pearn[3] orangen[4] grapen[0] exitn");

double price[5]={0.00,3.00,2.50,4.10,10.20};

for (int i=0;i

{

if (a[i]>=1 && a[i]<=4)

printf("price = %.2fn",price[a[i]]);

else

printf("price = 0.00n");

}

return(0);

}

6.猴子选大王

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:

输入在一行中给一个正整数N(≤1000)。

输出格式:

在一行中输出当选猴王的编号。

输入样例:

11

输出样例:

7

(1)编程思路。

为输出出圈顺序,采用一个数组来进行模拟。

定义int circle[N+1],并按circle[i]=i+1的方式赋予各元素初值。该值代表两个含义:1)值为0,代表编号i+1的猴子不再圈中;2)值非0,代表圈中第i个位置的猴子编号为i+1。

定义变量i代表报数位置的流动,i的初值为0,代表编号为1的猴子的位置,i的变化方式为:

i=(i+1)%(n),即0-->1-->2……->n-1 ->0-->1……。

i流动到了位置i后,该位置的猴子若已出圈(circle[i]==0),显然无法报数,得跳过该位置;若该位置的猴子在圈中,则报数(定义一个表示报数的变量p,初值为0,每次报数p++)。

当报数到3(即p==3)时,位置i的猴子出圈,记录出圈猴子数cnt++,同时p置为0。当出圈猴子数等于n时循环结束。

定义变量last记录最后获胜者编号,不输出中间过程。显然,if (cnt==n) last=circle[i]。

(2)源程序。

#include

int main()

{

int n,i,p,cnt,last;

int circle[1000];

scanf("%d",&n);

for (i=0;i

circle[i]=i+1;

i=0; // 报数指示

p=0; // 报数计数器

cnt=0; // 出圈猴子数

while (cnt

{

if (circle[i]!=0) p++;

if (p==3)

{

cnt++;

if (cnt==n) last=circle[i];

circle[i]=0;

p=0;

}

i=(i+1)%(n);

}

printf("%dn",last);

return 0;

}

7.矩阵运算

给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。

输入格式:

输入第一行给出正整数n(1

输出格式:

在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。

输入样例:

4

2 3 4 1

5 6 1 1

7 1 8 1

1 1 1 1

输出样例:

35

(1)编程思路。

定义二维数组int a[10][10];保存输入的n*n方阵。采用二重循环

for (i=0;i

for (j=0;j

{ }

对矩阵中除最后一行和最后一列以外的所有元素a[i][j]进行遍历,在求和时,不能累加副对角线上的元素值,副对角线上的元素满足条件 i+j==n-1。

(2)源程序。

#include

int main ()

{

int n;

int a[10][10];

scanf("%d",&n);

int i,j;

for (i=0;i

for (j=0;j

scanf("%d",&a[i][j]);

int sum=0;

for (i=0;i

for (j=0;j

if (i+j!=n-1)

{

sum+=a[i][j];

}

printf("%dn",sum);

return(0);

}

8.求矩阵的局部极大值

给定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

(1)编程思路。

定义二维数组int a[21][21];保存矩阵A,由于题目中行、列编号从1开始,因此输入的矩阵保存在二维数组中时,数组元素行和列的下标也从1开始,即a[0][0]~a[0[20]、a[1][0]~a[1][20]这样的元素空置不用即可。

对于M行N列的整数矩阵A,用二重循环

for (i=2;i

for (j=2;j

{ }

对每个非边界元素a[i][j]进行遍历,若该元素均大于其上(a[i-1][j])、下(a[i+1][j])、左(a[i][j-1])、右(a[i][j+1])的4个元素,则计数并输出该元素中及其行列编号。

(2)源程序。

#include

int main ()

{

int m,n;

int a[21][21];

scanf("%d %d",&m,&n);

int i,j;

for (i=1;i<=m;i++)

for (j=1;j<=n;j++)

scanf("%d",&a[i][j]);

int cnt=0;

for (i=2;i

for (j=2;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 %dn",a[i][j],i,j);

cnt++;

}

if (cnt==0)

{

printf("None %d %dn",m,n);

}

return(0);

}

9.统计不及格人数

有4名学生,每名学生有4门课程,编写程序,要求输入所有学生的成绩,然后统计每门课不及格的人数。

输入格式:

输入4名学生的4门课程到二维数组a[4][4] ,数据之间用一个空格分隔,每输入4个数,敲回车,成绩为整数。

输出格式:

在一行中输出每列数据中小于60的个数,即不及格人数,每个数据后有一个空格。

输入样例:

在这里给出一组输入。例如:

86 54 78 90

61 50 60 45

30 90 70 85

80 85 75 96

输出样例:

在这里给出相应的输出。例如:

1 2 0 1

(1)编程思路。

定义二维数组int a[4][4];保存4名学生的4门课程的成绩。采用二重循环

for (i=0;i<4;i++)

for (j=0;j<4;j++)

{ }

对二维数组中的各元素进行遍历。

(2)源程序。

#include

int main ()

{

int a[4][4];

int i,j;

for (i=0;i<4;i++)

for (j=0;j<4;j++)

scanf("%d",&a[i][j]);

for (j=0;j<4;j++)

{

int cnt=0;

for (i=0;i<4;i++)

if (a[i][j]<60)

cnt++;

printf("%d ",cnt);

}

printf("n");

return(0);

}

10.字符串替换

本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:

原字母 对应字母

A

B

C

D

X

Z

Y

X

W

C

… …

Y

Z

输入格式:

B

A

输入在一行中给出一个不超过80个字符、并以回车结束的字符串。

输出格式:

输出在一行中给出替换完成后的字符串。

输入样例:

Only the 11 CAPItaL LeTtERS are replaced.

输出样例:

Lnly the 11 XZKRtaO OeGtVIH are replaced.

(1)编程思路。

定义数组char str[81];保存输入的字符串,由样例可知,输入的字符串中含有空格,因此采用 gets(str)输入字符串,不能采用 scanf(“%s”,str)输入字符串。

用循环 for (i=0;str[i]!='0';i++) 对字符串中的每个字符进行遍历,对遍历的每个字符,若为答谢字母( if (str[i]>='A' && str[i]<='Z') ),则按替换规则进行转换,可用表达式简单描述为: str[i]='Z'-(str[i]-'A'); 。

(2)源程序。

#include

int main()

{

char str[81];

int i;

gets(str);

for (i=0;str[i]!='0';i++)

if (str[i]>='A' && str[i]<='Z')

str[i]='Z'-(str[i]-'A');

printf("%sn",str);

return 0;

}

11.组个最小数

给定数字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

(1)编程思路。

定义数组 int a[10],其中元素a[i]的值表示数字i出现的次数。

因为数的最高位不能为0,先在a[1]~a[9]之间找一个最小的元素值不为0的元素a[i],输出i,然后a[i]=a[i]-1(表示数字i在最高位已用了一个)。

之后,采用如下的二重循环,按数字0~9使用的个数,依次输出对应个数的数字,这样得到的数一定是最小数。

for (i=0;i<10;i++)

for (j=1;j<=a[i];j++)

printf("%d",i);

(2)源程序。

#include

int main()

{

int a[10],i,j;

for (i=0;i<10;i++)

scanf("%d",&a[i]);

for (i=1;i<10;i++)

if (a[i]!=0) break;

printf("%d",i);

a[i]--;

for (i=0;i<10;i++)

for (j=1;j<=a[i];j++)

printf("%d",i);

printf("n");

return 0;

}

12.IP地址转换

一个IP地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。

输入格式:

输入在一行中给出32位二进制字符串。

输出格式:

在一行中输出十进制格式的IP地址,其由4个十进制数组成(分别对应4个8位的二进制数),中间用“.”分隔开。

输入样例:

11110010

输出样例:

204.148.21.114

(1)编程思路。

定义数组 char ip[33];保存输入的二进制IP字符串,定义数组 int a[4]保存对应的4个十进制数。

32位二进制IP地址按每8位二进制一组(1个字节)转换为一个十进制数。

设n位B进制数为an-1an-2……a1a0,将其按权值展开后求和就可得到对应的十进制数ret。

对于ip[0]~ip[8]保存的8位二进制按上式写成循环如下:

ret=0;

for(i=0;i<8;i++)

ret=ret*2+ip[i]-'0';

将ip[0]~ip[7]、ip[8]~ip[15]、ip[16]~ip[23]、ip[24]~ip[31]这4组8位的二进制数按上面的方法转换为十进制数,分别保存到a[0]、a[1]、a[2]和a[3]中,最后按格式输出即可。

(2)源程序。

#include

int main()

{

char ip[33];

int a[4],num,i,j;

scanf("%s",ip);

num=0;

j=0;

for (i=0;ip[i]!='0';i++)

{

num=num*2+ip[i]-'0';

if ((i+1)%8==0)

{

a[j++]=num;

num=0;

}

}

printf("%d.%d.%d.%dn",a[0],a[1],a[2],a[3]);

return 0;

}


本文标签: 输出 输入 元素