浙大版C语言题目集7-1

7-1-1

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

输入格式:

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

输出格式:

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

将x插入到大于等于前一项,小于后一项的位置。

#include <stdio.h>

int main()
{
    int n,x,i=0,a[100];
    scanf("%d",&n);
    for(;i<n;i++){
    	scanf("%d",&a[i]);
	}
    scanf("%d",&x);
	for(i=0;i<n;i++){
		if (a[i+1]>x && a[i]<=x){
			printf("%d ",a[i]);
			printf("%d ",x);
		}else {
			printf("%d ",a[i]);
		}
	}
    return 0;
}

7-1-2

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

输入格式:

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

输出格式:

在一行中输出这n个整数的处理结果,相邻数字中间用一个空格分开,行末不得有多余空格。

要求是逆序存,再顺序输出

#include <stdio.h>

int main()
{
    int n,a[100],b[100],i=0;
    scanf("%d",&n);
    for (;i<n;i++){
    	scanf("%d",&a[i]);
	}
    for (i-=1;i>=0;i--){
    	b[n-i-1]=a[i];
	}
	for (i=0;i<n;i++){
		printf("%d ",b[i]);
	}
    return 0;
}

7-1-3

本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。

输入格式:

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

输出格式:

在一行中输出最大值及最大值的最小下标,中间用一个空格分开。

倒着遍历,取最小下标。

#include <stdio.h>

int main()
{
    int n,a[100],i=0,max,j;
    scanf("%d",&n);
    for (;i<n;i++){
    	scanf("%d",&a[i]);
	}
	i-=1;
    max=a[i];
    for (i-=1;i>=0;i--){
    	if (a[i]>=max) {
    		max=a[i];
    		j=i;
		}
	}
	printf("%d %d",max,j);  
    return 0;
}

7-1-4

本题要求将给定的n个整数从大到小排序后输出。

输入格式:

输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。

输出格式:

在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。

数组指针交换。比较前后项的大小,循环n-1次排序。

#include <stdio.h>

void change(int *a,int i){
	int t;
	t=*(a+i);
	*(a+i)=*(a+i+1);
	*(a+i+1)=t;	
}

int main()
{
    int n,a[100],i=0,j=0;
    scanf("%d",&n);
    for (;i<n;i++){
    	scanf("%d",&a[i]);
	}
	while (j<=n-1){
		for (i-=1;i>=0;i--){
			if (a[i+1]>a[i] && i+1<n) {
				change(&a[0],i);
			}
		}
		j++;
		i=n;
	}
	for (i=0;i<n-1;i++){
		printf("%d ",a[i]);  
	}
	printf("%d",a[i]); 
    return 0;
}

7-1-5

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

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

输入格式:

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

输出格式:

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

先找到最大值、最小值和对应的下标。

先交换最小值与第一个数的位置,如果原来第一个数是最大值,那么交换后最大值的下标变为原来最小值的下标。

再交换最大值和最后一个数的位置。

#include <stdio.h>

void change(int *a,int i,int j){
	int t;
	t=*(a+i);
	*(a+i)=*(a+j);
	*(a+j)=t;	
}

int main()
{
    int n,a[100],i=0,max,min,j=0,k=0;
    scanf("%d",&n);
    for (;i<n;i++){
    	scanf("%d",&a[i]);
	}
	
	max=a[0];
	min=a[0];
	for (i-=1;i>=0;i--){
		if (a[i]>max) {
			max=a[i];
			j=i;
		}
		if (a[i]<min) {
			min=a[i];
			k=i;
		}
	}
	
	change(&a[0],k,0);
	if (j==0) j=k;
	change(&a[0],j,n-1);
	
	for (i=0;i<n;i++){
		printf("%d ",a[i]);  
	}
    return 0;
}

7-1-6

给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。

输入格式:

输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。

输出格式:

在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n1、n2、……为出现次数最多的个位数字,按从小到大的顺序排列。数字间以空格分隔,但末尾不得有多余空格。

题目的正整数N好像没啥用?

先计算每个数字的个数,存到b[10]中。

再找b[10]中最大的值,最后输出值对应的下标(就是对应的数字)。

#include <stdio.h>

int main()
{
    int n,b[10]={0};
    char a;
    scanf("%d",&n);
    getchar();
    a=getchar();
    while (a!='\n'){
    	switch (a) {
	    	case '0':
	    		b[0]++;
				break;
			case '1': 
	    		b[1]++;
				break;
			case '2': 
	    		b[2]++;
				break;
			case '3': 
	    		b[3]++;
				break;
			case '4': 
	    		b[4]++;
				break;
			case '5': 
	    		b[5]++;
				break;
			case '6': 
	    		b[6]++;
				break;
			case '7': 
	    		b[7]++;
				break;
			case '8': 
	    		b[8]++;
				break;
	    	case '9': 
	    		b[9]++;
				break;
			default:
				break;
		}
		a=getchar();
	}
	
	int max;
	max=b[0];
	for (a=0;a<10;a++){
		if (b[a]>max) max=b[a];  
	}
	printf("%d:",max);
	for (a=0;a<10;a++){
		if (b[a]==max) {
			printf(" %d",a);
		}	
	}
    return 0;
}

7-1-7

本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。

输入格式:

输入在第一行中给出两个正整数N(≤20)和X,第二行给出N个整数。数字均不超过长整型,其间以空格分隔。

输出格式:

在一行中输出X的位置,或者“Not Found”。

遍历数组找数字,找到了输出下标。

#include <stdio.h>

int main()
{
    int n,x,i=0;
    scanf("%d",&n);
    int a[n];
    scanf("%d",&x);
    for(;i<n;i++){
    	scanf("%d",&a[i]);
	}
    for(i=0;i<n;i++){
    	if (a[i]==x) {
    		printf("%d",i);
    		i=n;
		}
	}
    if (i==n) printf("Not Found");
    return 0;
}

7-1-8

给定两个整型数组,本题要求找出不是两者共有的元素。

输入格式:

输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。

输出格式:

在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。

好难,我想吃面了——曹操

先找2个数组共有的数字,存到c[20]。

a[n1]与c[20]对比,不同的存入d[20]。同时a[n1]也要和d[20]中已有的数对比,相同的数字不再存入。

b[n2]相同的处理方式。

处理完成后,d[20]中存的就是不共有的数字,且不重复。

#include <stdio.h>

int main()
{
    int n1,n2,i=0,j=0,c[20],k=0,d[20],l=0;
	int flag=0;
    //录入第一个数组a[n1] 
    scanf("%d",&n1);
    int a[n1];
    for(i=0;i<n1;i++){
    	scanf("%d",&a[i]);
	}
	//录入第二个数组b[n1] 
    scanf("%d",&n2);
    int b[n2];
    for(i=0;i<n2;i++){
    	scanf("%d",&b[i]);
	}
	
	//a[n1]与b[n2]相同的数存入c[20]
	//k为c[20]中数字的个数 
	for(i=0;i<n1;i++){
		for(j=0;j<n2;j++){
			if(a[i]==b[j]){
				c[k]=a[i];
				k++;
			}
		}
	} 
	
	//a[n1]对比c[20]、d[20]中所有的数字,不同的存入d[20]  
	//l为d[20]中数字的个数
	//l=0时不用对比a[i]与d[20],先存入d[0] 
	//l>0时需要对比a[n1]与d[20],不要重复的数字 
	for(i=0;i<n1;i++){
		flag=0;
		for(j=0;j<k;j++){
			if(a[i]==c[j]){
				flag=1;
				break;
			}
		}
		if (l>0) {
			for(j=0;j<l;j++){
				if(a[i]==d[j]){
					flag=1;
					break;
				}
			}
		} 
		if(flag==0){
			d[l]=a[i];
			l++;
		}
	}
		
	//b[n2]相同的处理方式 
	for(i=0;i<n2;i++){
		flag=0;
		for(j=0;j<k;j++){
			if(b[i]==c[j]){
				flag=1;
				break;
			}
		}
		if (l>0){
			for(j=0;j<l;j++){
				if(b[i]==d[j]){
					flag=1;
					break;
				}
			}
		}
		if(flag==0){
			d[l]=b[i];
			l++;
		}
	}
	
	//输出d[20],行末不得有多余的空格 
	for(i=0;i<l-1;i++){
		printf("%d ",d[i]);
	}
	printf("%d",d[i]);	
    return 0;
}

7-1-9

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

输入格式:

输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数。数字间以空格分隔。

输出格式:

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

b[n]为去重后的数组,c[1000]为对应数字出现的次数。

遍历对比a[n]与b[n]。如果数字相等,证明b[n]中已有该数字,对应c[1000]加1。

如果数字不相等,b[n]中增加该数字,对应c[1000]加1。

最后c[1000]中最大的数字就是最大的次数,b[n]中相同下标的数字为出现次数最多的数字。

比如:a[3]={1,1,2}, 第一次循环后:b[0]=1, c[0]=1。

第二次循环后:b[0]=1, c[0]=2。

第三次循环后:b[0]=1, b[1]=2, c[0]=2, c[1]=1。

出现次数最多的是2次,数字1。

#include <stdio.h>

int main()
{
    int n;
	scanf("%d",&n);
	int a[n],i=0;
	for(;i<n;i++){
		scanf("%d",&a[i]);
	}
    
    //b[n]为a[n]去重的数组,k为b[n]中数字的个数 
	//c[1000]为数字对应的次数
	//flag=0表示数字相等,b[n]中已有该数字,c[1000]中对应次数+1,遍历a[n]的下一个数字。 
	//flag=1表示数字不相等,再遍历b[n]的下一个数字。保证b[n]中无该数字时,再增加b[k] 
    int b[n],c[1000]={0},j=0,k=1,flag;
    b[0]=a[0];
    for(i=0;i<n;i++){
    	flag=0;
    	for(j=0;j<k;j++){
    		if (a[i]==b[j]){
    			c[j]++;
    			flag=0;
				break;	
			} else {
				flag=1;
			}
		}
		if (flag==1){
			b[k]=a[i]; 
			c[k]++;
			k++;
		} 
	}
	
	//题目保证最大值唯一,所以找c[1000]最大数的下标就行 
	int max=c[1];
	for(i=0;i<k;i++){
		if(c[i]>max){
			max=c[i];
			j=i;
		}
	}
	printf("%d %d",b[j],c[j]);
    return 0;
}

7-1-10

给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。

现给定数字,请编写程序输出能够组成的最小的数。

输入格式:

输入在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。

输出格式:

在一行中输出能够组成的最小的数。

将给的内容转换为实际的数字,转换完就是从小到大排序的。0不能做首位,最小的数只需将非0的最小数字(从左到右第一个非0的数)换到第一位即可。

#include <stdio.h>

int main()
{
	int a[10],i=0,b[10],j=0,k=0;
	for(;i<10;i++){
		scanf("%d",&a[i]);
	}
	
	//转为数字(从小到大排序的) 
	for(i=0;i<10;i++){
		if(a[i]!=0){
			j+=a[i];
			for(;k<j;k++){
				b[k]=i;
			}
		}
	} 
	
	//第一个非0数与第一位交换(0不能放首位) 
	 for(i=0;i<k;i++){
	 	if (b[i]!=0){
	 		break;	 
		}
	 } 
	j=b[i];
	b[i]=b[0];
	b[0]=j;
	
	for(i=0;i<k;i++){
		printf("%d",b[i]);
	}
    return 0;
}

7-1-11

假设有N项物品,大小分别为s1​、s2​、…、si​、…、sN​,其中si​为满足1≤si​≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。装箱方法是:对每项物品, 顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。

输入格式:

输入第一行给出物品个数N(≤1000);第二行给出N个正整数si​(1≤si​≤100,表示第i项物品的大小)。

输出格式:

按照输入顺序输出每个物品的大小及其所在的箱子序号,每个物品占1行,最后一行输出所需的箱子数目。

复制数组到a[1000]。第一次输出的数是s[0] 1。

从a[i]开始和a[j]计算,如果和大于100,a[i]与下一项计算。最大到a[i-1],还不满足就把a[i]放最后,输出s[i]和对应的下标+1。

如果和小于100,a[i]放到a[j]的位置上,a[j]需要加上a[i],a[i]=0,输出s[i]和a[j]的位置。

所需的箱子数目是输出位置的最大值。

#include <stdio.h>

int main()
{
	int n;
	scanf("%d",&n);
	int s[n],i;
	for(i=0;i<n;i++){
		scanf("%d",&s[i]);
	}
	int j=0,a[1000],max=0;
	for(i=0;i<n;i++){
		a[i]=s[i];
	}
	printf("%d %d\n",s[0],1);
	for(i=1;i<n;i++){
		for(j=0;j<i;j++){
			if(a[i]+a[j]<=100){
				a[j]+=a[i];
				a[i]=0;
				break;
			}
		}	
		printf("%d %d\n",s[i],j+1);
		if(j+1>max) max=j+1;
	}
	printf("%d",max);
    return 0;
}
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值