洛谷题型摘选(一)


一、直角三角形

给出n(1≤n≤13),请输出一个直角边长度是 n 的数字直角三角形。所有数字都是 2 位组成的,如果没有 2 位则加上前加 0。

1.样例

输入:
5

输出:
0102030405
06070809
101112
1314
15

2.做题思路

看到输出的结果后,我首先想到的就是以前写过的那个数字金字塔,很显然需要两个for语句循环嵌套,每一行少一个值,再使用if语句使得个位数前面加上0就可以了。

3.代码如下:

#include <stdio.h>
int main()
{
	int n;
	scanf_s("%d", &n);
	int m = n;
	int x = 1;
	for (int i = 0; i < n; i++)			/* 行 */
	{
		for (int j = 1; j < m+1; j++)	/* 列 */
		{
			if (x < 10) printf("0%d", x);	/* 如果位个位数前面输出0 */
			else printf("%d", x);	/* 否则就输出本身 */
			x++;		/* 数字是递增的 */
		}
		m--;			/* 每一行都少一列 */
		printf("\n");	/* 换行 */
	}
	return 0;
}

二、两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

1.样例

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以输出:
[0, 1]

2.做题思路

看到题的第一眼还是有些懵,看了一会后就想到了一个比较笨的办法,就是两个循环嵌套语句,一个一个的试,直到找到对应的答案。

3.代码如下:

#include <stdio.h>
int main()
{
	int nums[4] = { 2,7,11,15 };	/* 给定的整数数组 */
	int target = 9;					/* 给定的目标值 */
	int i, j;
	for(i=0;i<4;i++)
		for (j = i+1; j < 4; j++)
		{
			if (nums[i] + nums[j] == target) goto end;	/* 找到答案后跳出所有循环 */
		}
	end:
	printf("[%d,%d]", i, j);
	return 0;
}

三、金币

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1
N+1天里,每天收到N+1枚金币。
请计算在前K天里,骑士一共获得了多少金币。

1.样例

输入:
6
输出:
14

输入:
1000
输出:
29820

2.做题思路

这是一道很经典的题,看到题的时候就有一股似曾相识的感觉。首先理解题意,第一天得到1个金币,第二天和第三天各得到2个金币,第四、五、六天每天得到3个金币,以此类推······如果为3天,就是1 * 1+2 * 2,6天就是1 * 1+2 * 2+ 3* 3,那么10天就是1 * 1+2 * 2+ 3* 3+4 * 4了,对于不是1,3,6,10等这种的时候,我们只需要减去多余天数就可以了。所以很明显需要一个循环语句。

3.代码如下:

#include <stdio.h>
int main()
{
	int n;
	scanf_s("%d", &n);
	int sum = 0;		/* 金币总数 */
	int i;				/* 当日得到金币数 */
	for (i = 1; n > 0; i++)
	{
		sum += i * i;
		n -= i;
	}
	sum += n * (i - 1);		/* 减去多得到的金币(n此时为负数,i已经自加过,所以-1)*/
	printf("%d", sum);
	return 0;
}

总结

上面的三道题都考察了循环语句的使用,也是相对其他题来说算是简单的题了,只要认真仔细想一想,总会有思路的。加油!😊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值