一、直角三角形
给出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;
}
总结
上面的三道题都考察了循环语句的使用,也是相对其他题来说算是简单的题了,只要认真仔细想一想,总会有思路的。加油!😊