(新手向)中国大学mooc高级语言程序设计相关OJ解答(三)

中国大学mooc高级语言程序设计地址:https://www.icourse163.org/course/JLU-62001

第五讲:模块化程序 & 数组初步–编程题

1组合问题(10分)

问题描述:编写程序,输入m,n的值,计算并输出函数f的值。
(新手向)中国大学mooc高级语言程序设计相关OJ解答(三)_第1张图片

输入:一个整数m和一个整数n。

输出:函数f的值。

样例:输入 4 2 输出 6

#include
int t(int x){
	int sum;
	sum=x;
    while(x>1){
	 sum*=(x-1);
    x--;}
    return sum;

}
int main(){
    int m,n,l;
    scanf("%d %d",&m,&n);
    if(m<n&&m>0&&n>0)printf("0");
    else if(m==n&&m>0&&n>0)printf("1");
    else if(m>n&&m>0&&n>0){
    	l=m-n;
	printf("%d",t(m)/t(l)/t(n));
	}
    else printf("-1");
    return 0;
    
}

暴力模拟就完事(但是如果m,n值很大会tle),可以参考杨辉三角优化算法。

2逆序数(10分)

问题描述:编写函数,求任意四位自然数的逆序数,例如5432就是2345的逆序数。

输入:任意一个整数

输出:如果输入的不是四位自然数,则输出0;否则输出对应的逆序数。

样例1:输入 12 输出 0

样例2:输入 654 输出456

#include
int main(){
	long a,i[4],t;
	scanf("%ld",&a);
	if(a<1000||a>9999)printf("0");
	else{
		for(t=1;t<=4;t++){
			i[t]=a%10;
			a/=10;
		}
		for(t=1;t<=4;t++){
			printf("%ld",i[t]);
		}
		
	}
	return 0;
}

还是那套求每位数的方法。这里注意跟对应的位数比较。

3转移0元素(10分)

问题描述:编写程序,把给定长度为10的整数数组中所有0元素全部移到后面,且所有非0元素的顺序不变。

输入:从键盘随机输入十个整数,作为数组a的元素。

输出:已将所有0元素串到后面的整数数组a的所有元素,各元素间无间隔字符。

样例:输入 0 1 1 0 0 0 1 3 2 0 输出1113200000

#include
int main(){
	long a[9],i,t=0;
	for(i=0;i<=9;i++)
	scanf("%ld",&a[i]);
	for(i=0;i<=9;i++){
		if(a[i]!=0)printf("%ld",a[i]);
		else t++;
	}
	while(t>0){
	printf("0");
	t--;}
	return 0;
	
}

先输出非零元素,然后用计数器计零个数,在最后再输出。

4循环右移(10分)

问题描述:编写程序,把给定长度为10的整数数组中所有元素循环右移 j 位。

输入:从键盘随机输入十个整数,作为数组a的元素;输入一个正整数j作为移动位数。

输出:移动后的整数数组a中的所有元素,各元素间无间隔字符。

样例:输入 1 2 3 4 5 6 7 8 9 0
2

输出 9012345678

#include
int main(){
	long a[9],j,i;
	for(i=0;i<=9;i++)
	scanf("%ld",&a[i]);
	getchar();
	scanf("%ld",&j);
	if(j>10)j%=10;//队列思想,移动位数可以大于十
	for(i=10-j;i<=9;i++){
		printf("%ld",a[i]);
	}
	for(i=0;i<10-j;i++){
		printf("%ld",a[i]);
	}
	return 0;
}

第六讲:数组应用–编程题

1矩阵重复元素检测(10分)

问题描述:编写程序判断任意给定3*3的两维整型数组中是否有相同元素。

输入:从键盘随机输入九个整数,作为数组的元素。

输出:如果数组中有相同元素,则输出“yes”;否则,输出“no”。

提示:OJ所用编译器,不支持bool类型。

样例1 输入 0 1 2 3 4 5 6 7 8 输出 no

样例2 输入 0 0 2 3 4 5 6 7 8 输出 yes

#include
int main(){
	long a[9],i,t=0,j;
	for(i=0;i<=8;i++)scanf("%ld",&a[i]);
	for(i=0;i<=8;i++)
	{
		for(j=i+1;j<=8;j++)
		if(a[i]==a[j])
		{
		t=1;
		break;
		}
	}
	if(t==1)printf("yes");
	else printf("no");
	return 0;
	
}

对应就完事。

2索引数组排序(10分)

问题描述:已知5个元素的整型数组 A 未排序,一个索引数组 B 保存 A 的下标。编写程序,在不改变数组A的情况下,只改变数组 B完成对A的排序,如下图所示。

输入:从键盘随机输入五个整数,作为数组A的元素。

输出:第一行输出排序后数组A的五个元素,各元素间无间隔字符;第二行输出数组B排序后的五个元素,各元素间无间隔字符。
(新手向)中国大学mooc高级语言程序设计相关OJ解答(三)_第2张图片

#include
int main(){
	long a[5],i,t=0,b[5],j,r;
	for(i=0;i<=4;i++)scanf("%ld",&a[i]);
	for(i=0;i<=4;i++)printf("%ld",a[i]);
	for(i=0;i<=4;i++)b[i]=a[i];//记录
	printf("\n");
		for(i=0;i<=4;i++)
		for(j=i+1;j<=4;j++)
		if(a[i]>a[j]){
			r=a[i];a[i]=a[j];a[j]=r;//冒泡排序
	}
	for(i=0;i<=4;i++)
	for(j=0;j<=4;j++)
	if(b[i]==a[j])printf("%ld",j);
	return 0;
	
		
}

3统计学生成绩(10分)

题目内容:编写一个程序统计某班(人数不超过50人)3门课程的成绩,它们是语文、数学和英语。先输入学生人数, 然后按编号从小到大的顺序依次输入学生成绩, 最后统计每门课程全班的总成绩和平均成绩。

输入:学生人数及每个学生各科成绩(每个学生的成绩占1行)

输出:每门课程全班的总成绩和平均成绩(第1行为各科总成绩,相邻2个数据之间间隔1个空格;第2行为各科平均成绩,相邻2个数据之间间隔1个空格)。

样例:

输入:

3

65 76 70

82 79 85

92 82 95

输出:

239 237 250

79 79 83

#include
int main(){
	long a[50][3],i,t,m,s1=0,s2=0,s3=0,s4=0,s5=0,s6=0;
	scanf("%ld",&m);
	for(i=0;i<=m-1;i++)
	for(t=0;t<=2;t++){
	scanf("%ld",&a[i][t]);}
	for(i=0;i<=m-1;i++){
	s1=s1+a[i][0];
	s2=s2+a[i][1];
	s3=s3+a[i][2];
	s4=s1/m;
	s5=s2/m;
	s6=s3/m;
	}
	printf("%ld %ld %ld\n",s1,s2,s3);
	printf("%ld %ld %ld",s4,s5,s6);
	return 0;
}

可以用结构体,但没必要()

4回文数(10分)

题目内容:编写一个程序判定用户输入的一个小于1010的正整数是否为“回文数”,所谓回文数是指正读反读都相同的数。

输入:一个正整数

输出:YES或NO

样例1: 输入:125521 输出:YES

样例2: 输入:1 输出:YES

#include
int main(){
	long a,i,t=1,j,r;
	scanf("%ld",&a);
	r=a;
	if(a<=9)printf("YES");
	else {
	while(a>=10){
	a/=10;t++;}
	long b[t];
	for(i=0;i<t;i++){
		b[i]=r%10;
		r/=10;
	}
	for(i=0;i<t/2;i++)
	for(j=t-1;j>=t/2;j--){
		if(((i+j)==t-1)&&(b[i]!=b[j]))r=1;
	}
if(r==1)printf("NO");
else printf("YES");


}
return 0;

}

还是老套路,求每位数,再比较。

5逆序存放(10分)

题目内容:将一个由10个元素构成的int数组中的元素按逆序重新存放。

输入:10个整数

输出:按逆序重新存放后的数组元素(相邻元素之间用一个空格隔开)

样例 输入:6 8 12 11 3 5 9 16 19 24 输出:24 19 16 9 5 3 11 12 8 6

#include
int main(){
	long a[10],i,j,r;
	for(i=0;i<=9;i++)scanf("%ld",&a[i]);
	for(i=0;i<=4;i++)
	for(j=9;j>=5;j--){
		if((i+j)%9==0){
			r=a[i];a[i]=a[j];a[j]=r;
		}
	}
	for(i=0;i<=8;i++)printf("%ld ",a[i]);
	printf("%ld",a[9]);
	return 0;
}

偷懒就反着输出,不偷就一个一个交换慢慢来。

第六讲:数组应用–编程题–拓展篇(不计入成绩)

1十进制数转换成其他进制数(10分)

题目内容: 编写一个程序将用户输入的十进制整数转换成给定进制的数。假设所有进制数长度不超过20位,所要转换的进制从从二进制变到九进制。

输入:十进制整数及要转换成的进制

输出:转换后的其它进制数

样例: 输入:32767 2 输出:11111111111111

样例: 输入:32767 6 输出:411411

#include
int main(){
	long a[20],i,r=0,t,m,n;
	scanf("%ld%ld",&m,&n);
	t=m;
	for(i=0;i<=19;i++){
		a[i]=m%n;
		m=m/n;
		r++;
		if(m<n){a[i+1]=m;break;}
	}
	for(;r>=0;r--)printf("%ld",a[r]);
	return 0;
	
}

简单的进制转换。

2猴子选大王(10分)

题目内容:n只猴子(n<100)要选大王,选举方法如下:所有猴子按1,2,3,……, n编号围坐一圈,从第1号开始按照1,2,……, m报数,凡报到m号的退出圈外,如此循环报数,直到圈内剩下一只猴子时,这只猴子就是大王。编程一个程序实现上述过程,n和m由键盘输入。

输入:猴子的数量n及报数的最大数字

输出:退出圈外的猴子编号序列(每数字后紧跟1个空格)

样例 输入: 5 3

输出: 3 1 5 2 4

#include
int main(){
	long n,m,i,t=-1,r=0long flag[100]={0};//初始化
	scanf("%ld%ld",&n,&m);
	for(i=1;i<=n;i++){
		while(r<m){
		t=(t+1)%n;//队列思想,出圈再循环
		if(flag[t]==0)r++;//检查标记,计数器+1
	}
		printf("%ld ",t+1);//数组下标与实际号码差1
		flag[t]=1;//对输出的元素标记
		r=0;//初始化
	}
	return 0;
}

挺有意思的一道题,只要掌握队列圈内循环的思想,这道题就迎刃而解了。

你可能感兴趣的:(c语言)