牛客竞赛语法入门班-循环结构习题代码(2)

 链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网

目录

1031 [NOIP1999]Cantor表

1032 最大的差

1033 成绩统计

1034 糖果俱乐部

1035 数字计数

1036 热杆上的蚂蚁

1037 焦虑的蚂蚁

1038 拯救小a

1040 YoungManDon'tSayFive

1041 魔法数字变换

1042 [NOIP2005]陶陶摘苹果

1043 [NOIP2004]津津的储蓄计划

1044 [NOIP2002]级数求和

1045 cayun日常之赏月

1046 鹏

1047 D博弈与核心能源动力

1048 好数

1049 3和5和7

1050 回文对称数

1051 数位之和

1052 箱子归位

1053 栗酱和火柴

1054 [NOIP2009]多项式输出

1055 更相减损术


1031 [NOIP1999]Cantor表

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:

 我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,3/1,2/2,…

 参考博客:https://blog.csdn.net/qq_64214980/article/details/122796476 

#include <iostream>
#include <cmath>
using namespace std;
int main(){
	// 奇数行时,分子由行数递减,分母由1递增
	// 偶数行时,分子由1递增, 分母由行数递减
	int n,fz,fm;
	cin >> n;
	int line,num=0;
	line=ceil((sqrt(8*n+1)-1)/2);//line表示位置为n的元素所在的行数
	num=(line-1)*line/2;//num表示前面的行数一共有多少个元素 
	if(line%2==0){//第Line行是偶数行 
		fz=1;	fm=line;
		while(num<n-1){
			fz++;	fm--;
			num++;
		} 
	}else{//第line行是奇数行 
		fz=line;	fm=1;
		while(num<n-1){
			fz--;	fm++;
			num++;
		}
	} 
	cout  << fz << "/" << fm << endl;
	return 0;
}

1032 最大的差

给定n个数字,请你从中选出两个数字,使得这两个数字的差尽量大,输出这个最大的差。

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main(){
	int n,min,max;
	cin >> n;
	int i;
	int arr[n];
	for(i=0;i<n;i++){
		cin >> arr[i];
	}
	sort(arr,arr+n);
	min=arr[0];
	max=arr[n-1];
	cout << max-min << endl;
	return 0;
}

1033 成绩统计

乎乎帮老师统计成绩,输入n个成绩,请编程统计输出n个成绩的平均分,最高分,最低分。

#include <iostream>
#include <algorithm>
using namespace std;
int main(){
	int n,i,t;
	int min,max;
	float aver,sum=0;//aver为平均成绩
	cin >> n;
	int arr[n]={0};
	for(i=0;i<n;i++){
		cin >> t;
		arr[i]=t;
		sum+=t; 
	}
	sort(arr,arr+n);
	min = arr[0];
	max=arr[n-1];
	aver=sum/n;
	printf("%.2f %d %d",aver,max,min);  
	return 0;
}

1034 糖果俱乐部

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
中国地质大学(武汉)坐落于南望山下毗邻东湖风景区。为了庆祝“华为杯”中国地质大学(武汉)第十七届ICPC程序设计大赛暨华中地区部分高校第十五届ICPC邀请赛竞赛的举办,校园中开展了许多有趣的热身小活动。 HW\ HW HW听到这个消息非常激动,他赶忙去参加了糖果俱乐部的活动。该活动的规则是这样的:摊位上有 n\ n n堆糖果,第 i\ i i堆糖果有aia_iai​个,参与的同学可以选择其中的任意堆,当所选择糖果的总数为偶数就可以把它们都带走啦~试问通过这个活动小 HW\ HW HW最多能在摊位上带走多少枚糖果。

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main(){
	int n,t,t1=0,t2=0,sum1=0,sum2=0;
	cin >> n;
	int arr1[n]={0},arr2[n]={0};//两个数组分别存储偶数和奇数元素 
	for(int i=0;i<n;i++){
		cin >> t;
		if(t%2==0){//存储偶数元素 
			arr1[t1]=t;
			t1++;
			sum1+=t; 
		}else{
			arr2[t2]=t;
			t2++;
			sum2+=t;
		}
	}
	if(sum2%2==0){//说明奇数元素的加和为偶数 
		cout << sum1+sum2 << endl; 
	}else{//说明需要去掉一个最小的奇数 
		sort(arr2,arr2+t2);
		int min=arr2[0];
		sum2-=min;
		cout << sum1+sum2 << endl; 
	}
	return 0;
}

1035 数字计数

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
给出n个数字,请你求出在给出的这n个数字当中,最大的数字与次大的数字之差,最大的数字与次小的数字之差,次大的数字与次小的数字之差,次大的数字与最小的数字之差.

#include <iostream>
#include <algorithm>
using namespace std;
int main(){
    //要求这四个值没有重复的
	int n,i,t,temp;
	int min1=100,min2=100,max1=0,max2=0;
	cin >> n;
	for(i=0;i<n;i++){
		cin >> t;
		if(t>max1){
			max2=max1;
			max1=t;
		}else if(t<max1&&t>max2){
			max2=t;
		}
		if(t<min1){
			min2=min1;
			min1=t;
		}else if(t>min1&&t<min2){
			min2=t;
		}
	}
	printf("%d %d %d %d",max1-max2,max1-min2,max2-min2,max2-min1);  
	return 0;
}

1036 热杆上的蚂蚁

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
有一个不断升温的杆子,上面有若干个蚂蚁,蚂蚁们需要尽快爬出这个杆子,否则就会因为高温而被烧死。这里假设每只蚂蚁行走的最大速度是 1cm/s. 当一只蚂蚁走到杆的尽头时,就会立即从秆上掉落,从而逃离热杆。我们知道每只蚂蚁在杆上的初始位置,但是,不知道蚂蚁向哪个方向前行。你的任务是计算所有蚂蚁都从杆上逃离可能的最短时间。

#include <iostream>
#include <algorithm>
using namespace std;
int main(){
	int len,n,t,min;
	cin >> len >> n;//杆的长度 (单位:cm) 和杆上蚂蚁数量 n
	int time=0;//需要的时间初始化为0 
	for(int i=0;i<n;i++){
		cin >> t;
		min=t<(len-t)?t:(len-t);
		if(time<min)
			time=min;//更新所需要的时间 
	}
	cout << time << endl;
	return 0;
}

1037 焦虑的蚂蚁

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网

一条长度为n的小径上,挤满了m只蚂蚁,每只蚂蚁有一个初始前进方向(向左或是向右),蚂蚁们的前进速度相同且均为1。小径的两端,均放着上了锁的箱子,箱内盛有美味的食物,蚂蚁们争相前进离开小径。不幸的是,小径十分狭窄,当两只蚂蚁相遇时,它们不得不掉头向着相反的方向前进。当所有的蚂蚁都离开小径时,锁才能够打开,蚂蚁们才能获得美味的食物。因此,蚂蚁们十分焦虑,它们想知道,到底花费多少的时间,它们才能够吃到美味的食物。你能够帮助他们解决问题吗?

参考博客:https://blog.csdn.net/qq_60404548/article/details/125443579

#include <iostream>
#include <cmath>
using namespace std;
int main(){
	int n,m;
	cin >> n >> m;//分别代表小径的长度,蚂蚁的数量
	int a,b;//分别表示蚂蚁的初始方向和坐标
	int time=0; 
	while(m--){
		cin >> a >> b;
		if(a==0){
			time=max(b,time);
		}else if(a==1){
			time=max(n-b,time);
		}
	}
	cout << time;
	return 0;
}

1038 拯救小a

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
小a生活在一个只有26个小写字母的文本里,我们知道在26个小写字母里,a是字典序最小的,所以小a十分的自卑,今天小a实在是受不了了,他想和伙伴们一起逃出这个文本,在逃出之前,他想问问你,这个文本里一共有多少个a?

#include <iostream>
#include <cmath>
using namespace std;
int main(){
	char c;
	int i=0; 
	cin >> c;
	while(c!='.'){
		if(c=='a'){
			i++;
		}
		cin >> c;
	}
	cout << i << endl;
	return 0;
}

1040 YoungManDon'tSayFive

众所周知,年轻人是不讲5的。作为年轻人,你应该继承这样的“优良传统”。

给定一个数串,输出时将其中的数字'5'替换成字符'*'。

#include <iostream>
#include <cmath>
#include <string>
using namespace std;
int main(){
	/*获取一行字符,单字符法
	char c;
	while((c=getchar())&&c!='\n')
	//字符串法
	char c[100];
	gets(c);
	while(c[i]!='\0')*/
	char c;
	char arr[1000010];
	int i=0;
	while((c=getchar())&&c!='\n'){
		arr[i++]=c;
	}
	for(int j=0;j<i;j++){
		if(arr[j]=='5')
			cout << "*";
		else 
			cout << arr[j];
	}
	return 0;
}

1041 魔法数字变换

有一个数字魔法,给你一个正整数n,如果n为偶数,就将他变为n/2, 如果n为奇数,就将他变为乘3加1

不断重复这样的运算,经过有限步之后,一定可以得到1

牛牛为了验证这个魔法,决定用一个整数来计算几步能变成1

#include <iostream>
using namespace std;
int main(){
	int n;
	cin >> n;
	int num=0;//num记录变换的次数,初始化为0 
	while(n!=1){
		if(n%2==0){
			n/=2;	num++;
		}else if(n%2==1){
			n=n*3+1;	num++;
		}
	}
	cout << num << endl;
	return 0;
}

1042 [NOIP2005]陶陶摘苹果

陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。

现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。

#include <iostream>
using namespace std;
int main(){
	int ans=0;//表示能够摘到的苹果的数目,初始化为0
	int arr[10]={0};//存储每个苹果距离地面的高度
	int maxh;//把手伸直的时候能够达到的最大高度
	for(int i=0;i<10;i++){
		cin >> arr[i];
	} 
	cin >> maxh;
	maxh=maxh+30;//能够摘到的最高的苹果 
	for(int i=0;i<10;i++){
		if(arr[i]<=maxh)
			ans++;
	}
	cout << ans << endl;
	return 0;
}

1043 [NOIP2004]津津的储蓄计划

 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。

    为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。

    例如11月初津津手中还有83元,妈妈给了津津300元。津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。到了11月月末,津津手中会剩下3元钱。

    津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。

    现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。

#include <iostream>
using namespace std;
int main(){
	int arr[12]={0};//存储每个月的预算金额 
	int x1=0,x2=0;//分别表示她手里的钱数和存储的钱数 
	int i,t,temp;
	for(i=0;i<12;i++)
		cin >> arr[i];
	for( i=0;i<12;i++){
		t=arr[i];
		temp=300-t;//表示这个月预算剩余的钱数 
		x1=x1+temp;//计算剩余的总钱数
		if(x1<0){//出现了某个月钱不够用的情况 
			cout << -(i+1) << endl;
			break;//退出循环 
		}else{
			int x=x1/100;//能够存储多少钱
			x2+=x*100; 
			x1-=x*100;
		} 
	}
	if(i==12){
		int ans=x2+x2*0.2+x1;
		cout << ans << endl;
	}
	return 0;
}

1044 [NOIP2002]级数求和

已知:Sn= 1+1/2+1/3+…+1/n。显然对于任意一个整数K,当n足够大的时候,Sn大于K。
现给出一个整数K(1<=k<=15),要求计算出一个最小的n;使得Sn>K。

#include <iostream>
using namespace std;
int main(){
	float k;
	cin >> k;
	double sum=1.0;//存储级数的和 必须用double类型存储
	int fm=1;
	while(sum<=k){
		fm+=1;
		sum+=1.0/fm;
	} 
	cout << fm << endl;
	return 0;
}

1045 cayun日常之赏月

在cayun星球月亮大小都有一个规律,月亮为每30天一个周期,在这30天的周期里,月亮的大小分别为0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,虽然天气很冷,但某个cayun今天却异常疯癫,不知为何居然想要赏月了。但他想在赏月之前知道今天的月亮到底有多大。

#include <iostream>
using namespace std;
int main(){
	int t;
	cin >> t;
	int a,b;
	while(t--){
		cin >> a >> b;
		if(a>b){//递减 减到1 
			if(b==0){
				cout << b+1 << endl;
			}else
				cout << b-1 << endl;
		}else{//递增,增到15 
			if(b==15){
				cout << b-1 << endl;
			}else
				cout << b+1 << endl;
		}
	} 
	return 0;
}

1046 鹏

化而为鸟,其名为鹏。鹏之背,不知其几千里也。

——《庄子·逍遥游》

HtBest的小鲲长大变成了大鹏,大鹏在天际翱翔,看到了一片绵延的山脉,每座山都有自己的高度,大鹏想穿过这片山脉。由于他只能紧贴地面飞行,他想知道他一共要翻越几次大山(上升->平飞->下降,算一次,其中平飞可以没有),初始时,大鹏在山脉的左端。

#include <iostream>
using namespace std;
int main(){
	int n;
	cin >> n;//表示山脉被分为n段。
	int ans=0;//表示需要翻越的次数,初始化为0
	//需要翻越的次数即为数列中相邻元素的递增递减次数 
	int prior,x,flag=0;//flag标志上升操作 
	cin >> prior;
	for(int i=1;i<n;i++){
		cin >> x;
		if(x>prior){
			flag=1;
			prior=x;//前驱元素 更新为x 
		}else if(x<prior){//有下降操作 
			if(flag){//构成一次翻越 
				ans++;
				flag=0;//flag重新置0
			}
			prior=x; 
		}
	}
	cout << ans << endl;
	return 0;
}

1047 D博弈与核心能源动力

ZWY最近喜欢在下课后喝酒,她说:“喝酒是人类进步的动力”。现在,便利商店推出了兑换活动。
    1.两个酒瓶可以兑换1瓶酒
    2.四个酒瓶盖子可以兑换1瓶酒
她先知道,在当前她所拥有的资金m和一些空酒瓶k、瓶盖g和当前酒价p已知情况下,她最多可以喝到多少瓶酒。

#include <iostream>
using namespace std;
int main(){
	int m,k,g,p;//分别是资金 空酒瓶 瓶盖 当前酒价 
	cin >> m >> k >> g >> p;
	int count=0; 
	int ans=0;//表示最多可以喝到多少瓶酒
	while(m>=p||k>=2||g>=4){//只要能再兑换酒就循环 
		if(m>=p){//可以用钱买酒 
			count=m/p;//表示钱能够买多少瓶酒
			m=m-count*p;
			ans+=count;
			k+=count;//空酒瓶数+count
			g+=count;//瓶盖数+count 
		}
		if(k>=2){//可以用酒瓶兑酒 
			count=k/2;//求出可以兑换多少瓶酒
			k=k-count*2;
			ans+=count;
			k+=count;
			g+=count;
		}
		if(g>=4){//可以用瓶盖兑换酒 
			count=g/4;
			g=g-count*4;
			ans+=count;
			k+=count;
			g+=count; 
		}
	} 
	cout << ans << endl;
	return 0;
}


1048 好数

定义好数:一个三位数,令其百位乘以十位得到的答案等于num,num的个位与这个三位数的个位相等。
求l到r的闭区间内,有多少个好数

#include <iostream>
using namespace std;
void fun(int l,int r){//判断在区间[l,r]内有多少个好数 
	int i,num,count=0;
	int a,b,c;//分别存储数字的百位、十位和个位数字 
	for(i=l;i<=r;i++){//遍历区间内的元素 
		c=i%10;
		b=(i/10)%10;
		a=i/100;
		num=a*b;//令num=百位乘以十位 
		if(num%10==c)
			count++;
	}
	cout << count << endl;
}
int main(){
	int t,l,r;
	cin >> t;//表示测试的组数
	while(t--){
		cin >> l >> r;
		fun(l,r); 
	} 
	return 0;
}

1049 3和5和7

在1~n中、找出能同时满足用3除余2,用5除余3,用7除余2的所有整数。

#include <iostream>
using namespace std;
int main(){
	int n;
	cin >> n;
	for(int i=1;i<=n;i++){
		if((i%3==2)&&(i%5==3)&&(i%7==2)){
			cout << i << endl;
		}
	}
	return 0;
} 

1050 回文对称数

今天牛牛学到了回文串,他想在数字里面找回文,即回文数,回文数是正着读与倒着读都一样的数,比如1221,343是回文数,433不是回文数。请输出不超过n的回文数。

#include <iostream>
using namespace std;
void fun(int n){
	int arr[6];//存储n的各位数字
	int i=0,j,temp=n;
	while(n){ 
		int t=n%10;
		arr[i++]=t;
		n/=10;
	} 
	for(j=0;j<i/2;j++){
		if(arr[j]==arr[i-1-j]){
			continue;
		}else{
			break;
		}
	}
	if(j==i/2)
		cout << temp << endl;
	
}
int main(){
	//输出不超过n的回文数
	int n;
	cin >> n;
	for(int i=1;i<=n;i++){
		fun(i);
	} 
	return 0;
}

1051 数位之和

求一个整数的所有数位之和

#include <iostream>
using namespace std;
int main(){
	int n;
	cin >> n;
	int sum=0;//存储整数n的所有数位之和 
	while(n){
		sum+=n%10;
		n/=10; 
	}
	cout << sum << endl;
	return 0;
}

1052 箱子归位

牛村的中央广场是一块5*5的矩阵空旷广场,广场上有且仅有一个救助箱,每天下班前,牛可乐都要把救助箱推回到广场的中心位置(第三行第三列),牛可乐可以向上下左右四个方向推箱子,一次只能推动一个单位,请问牛可乐要推几次才能把救助箱推回中心位置?

#include <iostream>
#include <cmath>
using namespace std;
int main(){
	int i,j,x,y;
	int ans=0;//最少推箱子的次数 
	int arr[6][6]={0};
	for(i=1;i<=5;i++){
		for(j=1;j<=5;j++){
			cin >> arr[i][j];
			if(arr[i][j]==1){
				x=i;	y=j;//用x,y暂存当前位置信息 
			}
		}
	}
	ans=abs(x-3)+abs(y-3);
	cout << ans << endl;
	return 0;
}

1053 栗酱和火柴

栗酱一个人闲得无聊的时候总是会一个人玩一些有趣的游戏。

        有一天,她在机房里看见了一张图,可能是做acm的学长留下的:

        栗酱想知道每一个数字,横着竖着分别有几根火柴呢?(由于火柴商偷工减料,我们认定,只要存在棍子,它就是火柴!)

#include <iostream>
using namespace std;
int main(){
	int t,a;
	int arr1[10]={2,0,3,3,1,3,3,1,3,3};//存储横着都有多少根火柴 
	int arr2[10]={4,2,2,2,3,2,3,2,4,3};//存储竖着都有多少根火柴 
	cin >> t;
	while(t--){
		cin >> a;
		cout << arr1[a] << " " << arr2[a] << endl;
	}
	return 0;
}

1054 [NOIP2009]多项式输出

一元n次多项式可用如下的表达式表示:

f (x) = anxn+ an-1xn-1 + ... + a1x + a0,a0≠0

其中,aixi 称为i 次项,ai 称为i次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:

1. 多项式中自变量为x,从左到右按照次数递减顺序给出多项式。

2. 多项式中只包含系数不为0的项。

3. 如果多项式n次项系数为正,则多项式开头不出现“+”号,如果多项式 n 次项系数为负,则多项式以“-”号开头。

4. 对于不是最高次的项,以“+”号或者“-”号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于0 次的项,其系数的绝对值为1,则无需输出1)。如果x的指数大于1,则接下来紧跟的指数部分的形式为“x^b”,其中b为x的指数;如果x的指数为1,则接下来紧跟的指数部分形式为“x”;如果x的指数为0,则仅需输出系数即可。

5. 多项式中,多项式的开头、结尾不含多余的空格。

#include <iostream>
#include <cmath>
using namespace std;
int main(){
	int n;//表示一元多项式的次数
	cin >> n;
	int arr[n+1]={0};//存储多项式各项的系数
	for(int i=n;i>=0;i--){//让数组下标与次数信息对应 
		cin >> arr[i];
	} 
	for(int i=n;i>=0;i--){
		if(arr[i]>0){
			if(i!=n)//不是首项 
				cout << "+";
			if(arr[i]!=1)
				cout << arr[i];
			if(i!=0&&i!=1){//当x的幂次不为0且不为1时 
				cout << "x^" << i; 
			} else if(i==1){//当x的幂次为1时 
				cout << "x";
			}else if(i==0&&arr[i]==1){//当最后一项为1时输出1 
				cout << arr[i];
			}
		}else if(arr[i]<0){
			cout << "-";//首先会输出负号
			if(arr[i]!=-1){//系数为-1时不输出1 
				cout << abs(arr[i]); 
			} 
			if(i==1)//幂次为1时 
				cout << "x";
			else if(i!=1&&i!=0){//当幂次不为1且不为0时 
				cout << "x^" << i; 
			}
			if(i==0&&arr[i]==-1)当最后一项为-1时输出
				cout << abs(arr[i]);
		}
	} 
	return 0;
}

1055 更相减损术

利用更相减损术求两个整数的最大公约数,即每次将较大的数变成大数减去小数的值

#include <iostream>
using namespace std;
int main(){
	int m,n;
	cin >> m >> n;
	while(m!=n){
		if(m>n){
			m=m-n;
		} else{
			n=n-m;
		}
	}
	cout << m << endl;
	return 0;
}

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值