2021级cpp上机练习题第10次(循环综合应用)

一、特别的数字-3

描述

判断一个整数x是不是在a~b之间(包含a和b)

输入

一个正整数n,表示有n组案例。

在每组案例中有三个整数x、a、b,其中x表示要判断的数字,a和b表示范围。

输出

针对每组案例,如果x在a~b之间,则输出Yes,否则输出No。每组案例输出完都要换行。

样例输入

2
6 5 100
6 10 20
 

样例输出

Yes

No

关键代码

*****
if (x >= a && x <= b) 
{
	cout << "Yes\n";
}
else 
{
	cout << "No\n";
}
*****

解释

if里面判断x是否在区间[a,b]内,不能写成a<=x<=y,要用&&,在区间内就输出Yes,否则就输出No。‘\n’的意思是换行。

二、特别的数字-4

描述

判断3个数字是否都相等

输入

一个正整数n,表示有n组案例。

在每组案例中有三个整数a、b、c,表示要判断的三个数。

输出

针对每组案例,如果a、b、c都相等,则输出Yes,否则输出No。每组案例输出完都要换行。

样例输入

2
5 5 5
5 6 7
 

样例输出

Yes

No

关键代码

*****
if (a == b && a == c)
{
	cout << "Yes\n";
}
else
{
	cout << "No\n";
}
*****

解释

if里面判断a是否等于b且a是否等于c,如果两个都等于的话说明三个数字相等,输出Yes,否则输出No。

三、特别的数字-5

描述

判断3个数字是否存在某两个数字是相等的

输入

一个正整数n,表示有n组案例。

在每组案例中有三个整数a、b、c,表示要判断的三个数。

输出

针对每组案例,如果a、b、c中有某两个数字是相等的(也包含三个数都相等的情况),则输出Yes,否则输出No。每组案例输出完都要换行。

样例输入

2
10 10 5
5 6 7
 

样例输出

Yes

No

关键代码

*****
if (a == b || a == c || b == c) 
{
	cout << "Yes\n";
}
else 
{
	cout << "No\n";
}
*****

解释

if里面是判断是否有两个数是相等的 ||表示里面只要有一个条件成立就是true,成立输出Yes,不成立输出No。

四、特别的数字-6

描述

判断3个数字是否只存在某两个数字是相等的(不包含三个数字都相等的情况)

输入

一个正整数n,表示有n组案例。

在每组案例中有三个整数a、b、c,表示要判断的三个数。

输出

针对每组案例,如果a、b、c中有某两个数字是相等的(不包含三个数都相等的情况),则输出Yes,否则输出No。每组案例输出完都要换行。

样例输入

3
10 10 5
5 6 7
5 5 5
 

样例输出

Yes

No

No

关键代码

*****
if ((a == b && a != c) || (a == c && a != b) || (b == c && b != a)) 
{
	cout << "Yes\n";
}
else 
{
	cout << "No\n";
}
*****

解释

第一个括号判断a与b相等但是a与c不相等的情况,第二个括号判断a与c相等但是a与b不相等的情况,第一个号断b与c等但是b与a不相等的情况。有一个成立就输出Yes,否则就输出No。

五、特别的数字-7

描述

判断一个数字是不是既大于10,又是3的倍数。

输入

一个正整数n,表示有n组案例。

在每组案例中有一个整数a,表示要判断的数字。

输出

针对每组案例,如果a既大于10,又是3的倍数,则输出Yes,否则输出No。每组案例输出完都要换行。

样例输入

3
9
12
14
 

样例输出

No

Yes

No

关键代码

*****
if (x > 10 && x % 3 == 0) 
{
	cout << "Yes\n";
}
else 
{
	cout << "No\n";
}
*****

解释

由描述既……又……得,两个条件是同时成立,所以if里面判断x>10和x是否是3的倍数,是的话输出Yes,否则输出No。

六、点和直线

描述

判断一个点是否在一条直线上

输入

第1行是一个正整数n,表示测试案例的数量

从第2行到第n+1行,每行有五个数字a、b、c、d、e(不一定是整数,c和d不会都为0),其中a和b是点的横坐标和纵坐标,c、d、e构成了一条直线cx+dy=e。

输出

如果点(a,b)在直线cx+dy=e上,则输出true,否则输出false。

每组案例输出完都要换行。

样例输入

1
1 1 1 1 2
 

样例输出

true

关键代码

*****
int n;
long double a, b, c, d, e;
cin >> n;
while(n--)
{
	cin >> a >> b >> c >> d >> e;
	if (c * a + d * b == e) 
	{
		cout << "true\n";
	}
	else 
	{
		cout << "false\n";
	}
}
*****

解释

首先是数据范围的问题,a、b、c、d、e不一定是整数,但是用double类型提交发现还是wrong answer 所以就要用long double,判断(a,b)是否在直线上最简单的方法是将a,b带入x,y,判断乘起来是否等于e,等于e就输出true,否则输出false。

七、顺丰快递

描述

根据邮件的重量和用户是否选择加急计算邮费。计算规则:重量在2000克以内(包括2000克),基本费10元。超过2000克的部分,每500克加收超重费3元,不足500克部分按500克计算;如果用户选择加急,多收8元。

输入

第1行是一个正整数n,表示测试案例的数量

从第2行到第n+1行,每行有1个正整数和1个字符,其中正整数表示邮件的重量,字符只可能是y或者n,如果是y,表示加急,如果是n,表示不加急。

输出

针对每组测试案例,输出邮费。

每组案例输出完都要换行

样例输入

1
2300 y
 

样例输出

21

关键代码

*****
postage = 0;
cin >> weight >> b;
postage += 10;
if (b == 'y') 
{
	postage += 8;
}
if (weight > 2000) 
{
	c = weight - 2000;
	for (c; c > 0; c -= 500) 
	{
		postage += 3;
	}
}
*****

解释

因为有多组案例,所以每次的邮费都要重置回0,基本费10元就要加10,第一个if判断用户是否加急,加急的话加8,第二个if判断重量是否超过2000g,c用来记录超过的部分,for循环是每超500g就加三块钱

八、疯狂的程序员

描述

有一个程序员给自己定了个目标,第1天写1个代码,之后两天(第2、3天)里,每天写2个代码;之后3天(第4、5、6天)里,每天写3个代码……当连续N天每天写N个代码后,程序员会在之后的连续N+1天里,每天写N+1个代码。

给定一个天数,问从第一天开始的这些天里,程序员一共写了多少个代码。

输入

第1行是一个正整数n,表示测试案例的数量。

从第2行到第n+1行,每行有1个正整数,表示天数。

输出

针对每组测试案例,输出程序员写了多少个代码。

每组案例输出完都要换行。

样例输入

1
3
 

样例输出

5

关键代码

*****
for (i = 1; i <= k; i++) 
{
	for (j = 1; j <= i; j++) 
    {
		if (d >= k) 
		{
			break;
		}
		else 
		{
			sum += i;
			d += 1;
		}
	}
}
*****

解释

外循环控制每天获得多少金币,内循环控制获得的几天,d储存过了几天,如果d比设定的天数大就不再获得金币,否则就获得i个金币。

九、奇数的乘积

描述

输入三个整数,输入其中所有奇数的乘积,如果其中都没有奇数,则输出0。

输入

第1行是一个正整数n,表示测试案例的数量。

从第2行到第n+1行,每行有3个整数。

输出

针对每组测试案例,输出3个整数中所有奇数的乘积,如果其中都没有奇数,则输出0。每组案例输出完后都要换行。

样例输入

2
1 2 3
4 5 6
 

样例输出

3

5

关键代码

*****
sum = 1;
if ((abs(x) % 2) == 1)//或者if(x%2==1||x%2==-1)下同
{
	sum *= x;
}
if ((abs(y) % 2) == 1)
{
	sum *= y;
}
if ((abs(z) % 2) == 1)
{
	sum *= z;
}
if ((abs(x) % 2) == 0 && (abs(y) % 2) == 0 && (abs(z) % 2) == 0)
{
	sum = 0;
}
*****

解释

奇数分正数和负数,所以加上abs函数,因为sum的初始值设置为1,所以要考虑输入的三个数都不是奇数的情况是输出0.

十、规范日期格式

描述

有很多种表示日期的方法,比如对于2017年10月21日而言,中国的表示方法是2017.10.21,英国的表示方法是Oct.21, 2017,美国的表示方法是21 Oct., 2017,十分混乱。

对于日期的表示方法,班宝hrr比较喜欢按照yyyy-mm-dd的形式表示,其中yyyy表示4位数的年份,不足4位的情况下前面补0,补到4位数;mm表示2位数的月份,不足2位的情况下前面补0;dd表示2位数的天数,不足2位的情况下前面补0。例如2017年1月1日表示成2017-01-01,其中年份和月份之间,以及月份和天数之间是字符减号。

输入

第1行是一个正整数n,表示测试案例的数量。
从第2行到第n+1行,每行是一组测试案例,有三个正整数a、b、c,其中a表示年份,b表示月份,c表示天数,1<=a<=9999,a、b、c构成的日期是合法有效的。

输出

针对每组案例,按照yyyy-mm-dd的格式输出日期。每组案例输出完都要换行。

样例输入

2
2017 1 1
189 3 20
 

样例输出

2017-01-01

0189-03-20

关键代码

*****
if (year / 1000 == 0) 
{
	cout << 0;
}
if (year / 100 == 0) 
{
	cout << 0;
}
if (year / 10 == 0) 
{
	cout << 0;
}
cout << year << '-';
if (month / 10 == 0) 
{
	cout << 0;
}
cout << month << '-';
if (day / 10 == 0) 
{
	cout << 0;
}
cout << day << endl;
*****
//更好的办法(使用printf)
*****
int year, month, day;
scanf("%d %d %d", &year, &month, &day);
printf("%04d-%02d-%02d\n", year, month, day);
*****

解释

由题意可知假如year不足四位,month和day不足2位的时候要补0,然后再按格式输出year/1000=0说明year不足4位,补一个0;year/100=0说明year不足三位,再补一个0,以此类推。

下面的更好的方法是用printf进行格式输出,不会的自行百度。

十一、伪素数

描述

判断一个数字a是否是m-伪素数。
m-伪素数的定义如下:如果一个大于1的整数a,除了1和自身外,能够整除的数字不多于m个,则称数字a是一个m-伪素数。
例如10是一个2-伪素数,因为10除了1和10以外,能够整除的数字有2和5,不多于2个。当然10也可以称为3-伪素数。

输入

第1行是一个正整数n,表示测试案例的数量。
从第2行到第n+1行,每行是一组测试案例,有两个整数a和m(其中a>1,m>=0)

输出

针对每组案例,如果a是m-伪素数,则输出yes,否则输出no。每组案例输出完都要换行。

样例输入

2
12 2
12 4
 

样例输出

no

yes

关键代码

*****
for (int b = 2; b <= sqrt(m); b++)
{
	if ((m % b) == 0)
	{
		sum += 2;
	}
	if (b * b == m)
	{
		sum -= 1;
	}
}
*****

解释

这为判断因数个数的循环因为因数都是成对出现的,所以只需要判断到根号m就行,唯一要注意的是如果m是完全平方数,那么它的因数个数应该减少一个。如25,计算到5的时候会+2,实际上只有一个5的因数,寻找因数个数还有一种筛的方法,详情第三次线上赛小结_xiaooochaooo的博客-CSDN博客

中的六、哪类更多。

十二、双向箭头

描述

根据a和b的值输出由*组成的双向箭头形状。

其中a是正奇数,代表图案有几行;b是正整数,代表双向箭头中间的横线有多长。

输入

只有一组案例,由两个正整数a和b组成。

输出

根据a和b的值输出由*组成的双向箭头形状。每行最后不要有多余空格。最后一行星号输出完有个换行。

样例输入

 5 3
 

样例输出

关键代码

*****
int p1 = (a + 1) / 2, p2 = (a + 1) / 2;
int q1 = (a + 1) / 2 + b + 1, q2 = (a + 1) / 2 + b + 1;
for (int i = 1; i <= a; i++)
{
	for (int j = 1; j <= q2; j++)
	{
		if (i == (a+1)/2)
		{
			cout << "*";
		}
		else
		{
			if (j >= p1 && j <= p2 || j >= q1 && j <= q2)
			{
				cout << "*";
			}
			else
			{
				cout << " ";
			}
		}
	}
	cout << endl;
	i < (a + 1) / 2 ? p1-- : p1++;
	i < (a + 1) / 2 ? q2++ : q2--;
}
*****

解释

外循环输出行,内循环输出列 ,观察输出图形可知,最中间的一行全输出星号,p1、p2、q1、q2

用来记录该输出*的位置,内循环中j不能小于等于图形的总长度,因为输出最后一个星号后面不能有空格。然后每行输出完要换行,下面的两个三目运算符判断在输出图形的上半部分还是下半部分,上半部分前面输出星号的位置要提前,后面输出星号的位置要往后,下半部分同理。

十三、完全平方数-3

描述

数学上,若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。

计算a到b之间所有完全平方数的和。

输入

一个正整数n,表示案例的数量。

每组案例由2个整数a和b组成。(-900000000<=a<=b<=900000000)

输出

针对每组案例,输出一个长整数(long long int),表示a到b之间(包含a和b)所有完全平方数的和。

每组案例输出完都要换行。

样例输入

2
4 10
-1 5
 

样例输出

13

5

关键代码

*****
if (x < 0)
{
	x = 0;
}
if (y < 0)
{
	y = 0;
}
t = sqrt(x), t1 = sqrt(x);
if (t != t1)
{
	t += 1;
}
m = sqrt(y);
for (t; t <= m; t++)
{
	sum = sum + t * t;
}
*****

解释

用传统遍历的方法一定会超时,所以只需要遍历到根号y就行,如果x或者y小于0,就可以直接从0开始循环,第三个if是x可能不是完全平方数,比如x=7,t就是2,t1就是二点几,所以从3开始循环就可以了,最后一个循环是寻找完全平方数。

十四、平方和-3

描述

已知一个正整数x,问x能否凑成三个互不相同的正整数的平方和。

输入

一个正整数n,表示测试案例的数量。

每组案例由一个正整数x组成(x不大于1e+8)。

输出

针对每组案例,如果x可以表示成三个互不相同的正整数的平方和,那么输出Yes,否则输出No。

每组案例输出完都要换行。

样例输入

2
30
10
 

样例输出

Yes

No

关键代码

*****
bool f(int x)
{
	for (int i = 1; i * i <= x / 3; i++)
	{
		for (int j = i + 1; j * j <= (x - i * i) / 2; j++)
		{
			int m = x - i * i - j * j;
			int k = sqrt(m);
			if (k * k == m)
			{
				return true;
			}
		}
	}
	return false;
}
*****

解释

用传统的三层循环必定超时数字很大,所以就想办法去掉一层循环,所以判断输入的数减去前面两层循环的数是不是完全平方数就可以判断这个数是不是由三个数的平方和组成,通过找规律可得,循环的两个数字不超过x/3 和(x-i*i)/2。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值