郑州轻工业大学zzulioj1111~1123合集
本人小趴菜一颗,写博客是为了监督自己的学习以及分享学习资源给需要的人,欢迎大家评论区指出问题。同时由于本人比较懒,注释就不再写了,当然一些自己经常犯迷糊的地方还是会标注的,大家有什么问题也可以指出来,大家一起学习进步。
郑州轻工业大学zzulioj1111~1123合集
1111多个整数的逆序输出(函数专题)
题目描述
输入n和n个整数,以与输入顺序相反的顺序输出这n个整数。要求不使用数组,而使用递归函数实现。
递归函数实现过程如下:
void inverse(int n)
{
读入一个整数,存入num;
if(n >1)
{
将后面的n-1个数逆序输出: inverse(n-1);
输出num;
}
if( n == 1) 直接输出num;
}
输入
输入有n + 1行,第一行是一个正整数n,接下来n行有n个整数。
输出
输出n个整数,顺序与输入顺序相反,每个整数后有一个空格。
样例输入 Copy
5
11
22
33
44
55
样例输出 Copy
55 44 33 22 11
代码如下(示例):
#include<stdio.h>
void inverse(int n)
{ int num;
scanf("%d",&num);
if(n >1)
{
inverse(n-1);
printf("%d ",num);
}
if( n == 1)
{
printf("%d ",num);
}
}
}//用到了递归函数,这个比较考验逻辑能力,自己要多想一想,搞清楚每次n这个变量值的被谁取代,搞清楚每一层之间的关系,虽然这个题在之后的数组中十分简单但是大家可以在这类题上锻炼逻辑能力,我就经常迷糊【苦笑】
int main()
{
int n;
scanf("%d",&n);
inverse(n);
return 0;
}
1112进制转换(函数专题)经典题
题目描述
输入一个十进制整数n,输出对应的二进制整数。常用的转换方法为“除2取余,倒序排列”。将一个十进制数除以2,得到余数和商,将得到的商再除以2,依次类推,直到商等于0为止,倒取除得的余数,即为所求的二进制数。例如,把52换算成二进制数的计算过程如下图:
52除以2得到的余数依次为0,0,1,0,1,1,倒序排列,得到52对应的二进制数110100。
用递归的思想来描述上述计算过程是这样的:输出n/2对应的二进制数,然后输入%2。递归函数的实现过程如下:
void convert(int n)
{
if(n > 0)
{
调用自身,输出n/2对应的二进制数;
输出n%2;
}
}
试试吧!
输入
输入一个正整数n。
输出
输出n对应的二进制数。
样例输入 Copy
52
样例输出 Copy
110100
代码如下(示例):
#include<stdio.h>
void convert(int n)
{
int m;
if(n > 0)
{
m=n%2;//这一步很关键
convert(n/2);//依次递归下去直到新的n是1结束这个递归,进行下一步的输出,比较像是套娃,一层层套进去之后输出是从最里面一层开始逐层输出
printf("%d",m);
}
}
int main()
{
int n;
scanf("%d",&n);
convert(n);
}//这类题要尝试自己写出来,因为正式考试中是没有题目中的提示的,顶多给你一个函数名,让你引用
1113递归调用的次数统计(函数专题)
题目描述
如下程序的功能是计算 Fibonacci数列的第n项。函数fib()是一个递归函数。请你改写该程序,计算第n项的同时,统计调用了多少次函数fib(包括main()对fib()的调用)。
#include<stdio.h>
int fib(int k);
int main()
{
int n;
scanf(“%d”, &n);
printf(“%d\n”, fib(n));
return 0;
}
int fib(int k)
{
if(k == 1 || k == 2)
return 1;
else
return fib(k-1) + fib(k-2);
}
输入
输入一个正整数n。
输出
输出包含两行,第一行是一个整数,表示第n项的值;第二行输出递归调用了多少次,具体格式见输出样例。
样例输入 Copy
20
样例输出 Copy
6765
递归调用了13529次
代码如下(示例):
#include<stdio.h>
int m=0;
int b(int m);
int fib(int k)
{
m++;
if(k == 1 || k == 2)
return 1;
else
return fib(k-1) + fib(k-2);//递归套娃哟
return m;
}
int b(int n)
{
printf("%d\n", fib(n));
printf("递归调用了%d次",m);
}
int main(void)
{
int m,n;
scanf("%d", &n);
b(n);
}
1114逆序(数组)
题目描述
输入n(1<=n<=10)和n个整数,逆序输出这n个整数。
输入
输入n(1<=n<=10),然后输入n个整数。
输出
逆序输出这n个整数,每个整数占4列,右对齐。
样例输入 Copy
6
4 5 6 1 2 3
样例输出 Copy
3 2 1 6 5 4
代码如下(示例):
#include <stdio.h>
//定义宏常量N为10
#define N 10
int main()
{
int i, n;
//定义长度为10的整型数组
int a[N];
//输入n
scanf("%d", &n);
for(i = 0; i < n; i++)
//输入n个整数
scanf("%d", &a[i]);
for(i = n - 1; i >= 0; i--)
//逆序输出n个整数
printf("%4d", a[i]);
return 0;
}
1115数组最小值
题目描述
数组a有n个元素,请输出n个元素的最小值及其下标。若最小值有多个,请输出下标最小的一个。注意,有效下标从0开始。
输入
输入分两行,第一行是一个正整数n(n<=1000),第二行是n个整数。
输出
输出占一行。输出数组的最小值及其下标,用空格隔开。
样例输入 Copy
5
8 4 5 1 2
样例输出 Copy
1 3
代码如下(示例):
#include<stdio.h>
# define N 1000
int main()
{
int i,n,m,j=0;
int a[N];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
m=a[0];
for(i=1;i<n;i++)
{
if(m>a[i])
{
m=a[i];
j=i;
}
}
printf("%d %d",m,j);
return 0;
}
1116删除元素(经典题)
题目描述
输入一个递增有序的整型数组A有n个元素,删除下标为i的元素,使其仍保持连续有序。注意,有效下标从0开始。 定义如下两个函数分别实现删除元素操作和数组输出操作。
void del(int a[], int n, int i); /删除数组a中下标为i的元素/
void PrintArr(int a[], int n); /输出数组a的前n个元素/
输入
输入分三行,第一行是一个整数n(n<10),第二行是n个整数,第三行是要删除元素的下标i,i>=0。
输出
输出删除下标为i的元素后的数组元素,数据之间用空格隔开。
样例输入 Copy
6
1 3 5 7 9 11
3
样例输出 Copy
1 3 5 9 11
代码如下(示例):
#include<stdio.h>
#define N 1000
void del(int a[], int n, int i)
{
int j;
for(j=i;j<n-1;j++)
{
a[j]=a[j+1];
}
}
void PrintArr(int a[], int n)
{
int j;
for(j=0;j<n-1;j++)
{
printf("%d ",a[j]);
}
}
int main()
{
int n,a[N],i,j;
scanf("%d",&n);
for(j=0;j<n;j++)
{
scanf("%d",&a[j]);
}
scanf("%d",&i);
del(a,n,i);
PrintArr(a,n);
return 0;
}
1117查找数组元素(经典题)*
题目描述
输入n个整数构成一个数组,在这个数组中查找x是否存在,如果存在,删除x,并输出删除元素后的数组。如果不存在,输出“Not Found”。
定义一个查找函数find(),在数组a中查找x,若找不到函数返回-1,若找到返回x的下标,函数原型如下:
int find(int a[], int n, int x);
然后在main()中,先调用函数find(),若查找失败输出“Not Found";若查找成功,则调用上一题中定义的函数del()删除该元素,再调用上一题中的PrintArr()输出删除元素后的数组内容。
输入
输入第一行是一个正整数n(1<=n<=10);
第二行是n个整数,构成一个数组;
第三行是一个整数x,表示待查找元素。
输出
输出删除元素后的数组,每个元素占4列,右对齐。如果不存在,输出“Not Found”。如果数组中有多个x,只删除下标最小的那个。
样例输入 Copy
6
3 6 2 4 7 9
4
样例输出 Copy
3 6 2 7 9
代码如下(示例):
#include<stdio.h>
int find(int a[],int n,int x)
{
int i,m=-1;
for(i=0;i<n;i++)
{
if(x==a[i])
{
m=i;
}
}
return m;
}
void del(int a[],int n,int i)
{
int j;
for(j=i;j<n-1;j++)
{
a[j]=a[j+1];
}
}
void PrintArr(int a[],int n)
{
int i;
for(i=0;i<n-1;i++)
{
printf("%4d",a[i]);
}
}
int main()
{
int n,x,i,j,a[10];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&x);
j=find(a,n,x);
if(j==-1)
{
printf("Not Found");
}
else
{
del(a,n,j);
PrintArr(a,n);
}return 0;
}
1118数列有序(经典题)
题目描述
一个非递减有序的整型数组有n个元素,给定一个整数num,将num插入该序列的适当位置,使序列仍保持非递减有序。
要求定义一个函数insert(),将整数num插入在数组a的适当位置上,函数原型如下:
void insert(int a[], int n, int num);
另外函数仍然调用以前定义过的函数PrintArr()输出数组所有元素。
输入
输入有三行。第一行是一个正整数n,n<=1000。第二行是n个整数,第三行是待插入整数num。
输出
输出非递减有序的n+1个整数,数据之间用空格隔开。输出占一行。
样例输入 Copy
5
1 2 4 5 6
3
样例输出 Copy
1 2 3 4 5 6
提示
元素之间有空格,最后一个元素后面没有空格。序
代码如下(示例):
#include<stdio.h>
void insert(int a[],int n,int num)
{
int i;
for(i=n-1;i>=0;i--)
{
if(a[i]>num)
{
a[i+1]=a[i];
}
else{break;}
}
a[i+1]=num;
}
void PrintArr(int a[],int n)
{
int i;
for(i=0;i<=n;i++)
{
printf("%d ",a[i]);
}
}
int main()
{
int i,num,n,a[1001];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&num);
insert(a,n,num);
PrintArr(a,n);
return 0;
}
1119一维数组排序
题目描述
对一维数组按照从小到大的顺序排序。程序定义函数sort()来实现数组a的排序。函数原型如下:
void sort(int a[], int n);
数组元素的输出调用PrintArr()。
输入
第一行输入一个整数n(1<=n<=10),表示数组有n个整数;第二行输入n个整数。
输出
输出占一行。对这n个整数数按照从小到大的顺序输出,数据之间用一个空格隔开。
样例输入 Copy
6
6 5 1 2 3 4
样例输出 Copy
1 2 3 4 5 6
代码如下(示例):
#include<stdio.h>
void sort(int a[], int n)
{
int i,j,t;
for(i=0; i<n; i++)
{
for(j=i+1; j<n; j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
}
void PrintArr(int a[],int n)
{
int i;
for(i=0; i<n; i++)
{
printf("%d ",a[i]);
}
}
int main()
{
int a[1000],j,n;
scanf("%d",&n);
for(j=0; j<n; j++)
{
scanf("%d",&a[j]);
}
sort(a,n);
PrintArr(a,n);
return 0;
}
1120最值交换
题目描述
有一个长度为n的整数序列。请写一个程序,先把序列中的最小值与第一个数交换,再把最大值与最后一个数交换。输出转换好的序列。 分别编写两个函数MinIndex()和MaxIndex()来计算最小值下标和最大值下标。
int MinIndex(int a[], int n); //函数返回数组a中最小元素的下标
int MaxIndex(int a[], int n); //函数返回数组a中最大元素的下标
数组元素的输出调用函数PrintArr()。
输入
输入包括两行。
第一行为正整数n(1≤n≤10)。
第二行为n个正整数组成的序列,保证没有重复元素。
输出
输出转换好的序列。数据之间用空格隔开。
样例输入 Copy
5
5 4 1 2 3
样例输出 Copy
1 4 3 2 5
代码如下(示例):
#include<stdio.h>
int MinIndex(int a[], int n)
{
int i,min=0;
for(i=1;i<n;i++)
{
if(a[min]>a[i])
{
min=i;
}
}
return min;
}
int MaxIndex(int a[], int n)
{
int i,max=0;
for(i=1;i<n;i++)
{
if(a[max]<a[i])
{
max=i;
}
}return max;
}
void PrintArr(int a[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
}
int main()
{
int n,i,b,c,t,a[100];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
b=MinIndex(a,n);
t=a[0];
a[0]=a[b];
a[b]=t;
c=MaxIndex(a,n);
t=a[n-1];
a[n-1]=a[c];
a[c]=t;
PrintArr(a,n);
return 0;
}
1121电梯
题目描述
在某一高层建筑内只有一部电梯,当你按下一个数时,电梯会运行到那一层。已知电梯每上升一层需6秒,下降一层需4秒,在需要停留的那层停留5秒。现有N个整数组成的一个需求列表,电梯将依次响应,电梯从0层开始运行,而在运行过程结束之前不会返回0层。
注意,若出现相邻两个整数相等,代表在同一层执行了两个不同任务,可以理解为:电梯已经停了5秒,正要关门时又有人在同一层按开门键,电梯又开门并停留5秒。
输入
输入分两行,第一行是一个正整数N(N<=1000),代表停留几次,第二行的N个数字代表这几次依次停留的楼层。
输出
输出电梯完成该任务序列所需的时间,单独占一行。
样例输入 Copy
3
2 3 1
样例输出 Copy
41
代码如下(示例):
#include<stdio.h>
int main()
{
int n,i,a[1000],t=0;
scanf("%d",&n);
a[0]=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
if(a[i]<a[i+1])
{
t=t+(a[i+1]-a[i])*6+5;
}
else if(a[i]>a[i+1])
{
t=t+(a[i]-a[i+1])*4+5;
}
else
{
t+=5;
}
}
printf("%d",t);
return 0;
}
1122小明的调查作业
题目描述
小明的老师布置了一份调查作业,小明想在学校中随机找N个同学一起做一项问卷调查,聪明的小明为了实验的客观性,他先随机写下了N个1到1000之间的整数(0<N≤1000),不同的数对应着不同的学生的学号。但他写下的数字难免会有重复数字,小明希望能把其余重复的数去掉,然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
输入
输入有2行,第1行为1个正整数,表示整数的个数:N.
第2行有N个用空格隔开的正整数,表示小明写下的N个整数。
输出
输出也是2行,第1行为1个正整数M,表示不相同的整数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的整数。
样例输入 Copy
10
20 40 32 67 40 20 89 300 400 15
样例输出 Copy
8
15 20 32 40 67 89 300 400
代码如下(示例):
#include<stdio.h>
int main()
{
int n,i,j,a[1000],m,t;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
m=n;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}//从小到大排序
for(i=0;i<n-1;i++)
{
if(a[i]==a[i+1])
{
a[i]=0;//这个和后面的输出有关要注意本题条件已经说明0不是数组中的输入整数
m-=1;
}
}//去重加统计去重之后的数量
printf("%d",m);//输出去重后的数组数量
printf("\n");//换行
for(i=0;i<n;i++)
{
if(a[i]==0)
continue;
else
printf("%d ",a[i]);
}//输出排序去重后的数组
return 0;
}
1123最佳校友
题目描述
北京校友会每年举办两次,所有校友都有校友编号,每次到会的校友都在签到簿上写下自己的编号和姓名,在校友会成立5周年的聚会上将颁发“最佳校友奖”,该奖项颁发给到会次数最多的校友。现在请你编写程序,找出这个奖项的得主。若有多个校友并列第一,则均可获奖。
输入
输入若干个整数,表示签到簿上的校友编号,所有编号均为0~99的整数,以一个负数作为输入结束的标志。
输出
输出出现次数最多的编号。若获奖选手有多个,则按从小到大的顺序输出选手编号,用空格隔开。
样例输入 Copy
4 5 3 1 3 4 2 7 -1
样例输出 Copy
3 4
代码如下(示例):
#include<stdio.h>
int main()
{
int a[100]={0};
int i,j=0,num;
int max;
while(scanf("%d",&num),num>=0)
{
a[num]++;//记录a【】数组中num出现几次
}
max=a[0];//把0出现的次数赋给max
for(i=1;i<100;i++)
{
if(a[i]>max)
{
max=a[i];
}
}//把数组中出现的最多次数赋值给num
for(i=0;i<100;i++)
{
if(a[i]==max&&j==0)
{
printf("%d",i);
j=1;
}
else if(max==a[i]&&j!=0)
{
printf(" %d",i);
}
else
continue;
}
return 0;
}
标签:输出,int,样例,scanf,1123,ZZULIOJ1111,数组,合集,输入
From: https://blog.csdn.net/2301_80341258/article/details/140572786