【百日刷题计划 第三天】——熟悉语法 语法基础题
文章目录
- 💥前言
- 😉解题报告
- 💥 [NOIP2011 普及组] 数字反转[biu~](https://www.luogu.com.cn/problem/P1307)
- 🤔一、思路:
- 😎二、源码:
- 😮三、代码分析:
- 💥 [NOIP1999 普及组] Cantor 表[biu~](https://www.luogu.com.cn/problem/P1014)
- 🤔一、思路:
- 😎二、源码:
- 😮三、代码分析:
- 🤗 鸡汤来咯:
💥前言
☀️大家好☀️,我是烧蔬菜😁,最近做算法题可以感受到自己确实有点懈怠了😐,所以给自己定一个百日刷题计划,希望自己可以一直坚持下去💪,每天做题,也把题题解写下,记录自己每天的做题痕迹来激励提升自己获取正反馈✊,并且与大家分享下去😁
😉解题报告
💥 [NOIP2011 普及组] 数字反转biu~
☘️ 题目描述☘️
给定一个整数 N N N,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 2)。
输入格式
一个整数 N N N。
输出格式
一个整数,表示反转后的新数。
样例 1
样例输入 1
123
样例输出 1
321
样例 2
样例输入 2
-380
样例输出 2
-83
🤔一、思路:
(1)反转数除非本身是
0
0
0,否则最高位不得为
0
0
0;
(2)负号原地不动,罚站.ing
😎二、源码:
#include <iostream>
using namespace std;
int n;
string ret; //(1)
int flag = 0; //(2)
int main() {
cin >> n;
if (n < 0) { //(3)
ret += '-';
n *= -1;
}
if (n == 0) { //(4)
ret += '0';
}
while (n) { //(5)即n % 10 || n / 10
if (n % 10 || flag) { //(6)
ret += n % 10 + 48;
flag = 1;
} else {
}
n /= 10; //(7)
}
cout << ret;
return 0;
}
😮三、代码分析:
(1)创建一个字符串类型,方便存储反转后的数字
(2)判断反转后最高位,即第一位数是否为
0
0
0;
(3)若输入负整数,将负号存入
r
e
t
ret
ret内,并将负整数变为正整数
(4)若输入整数为
0
0
0,则将
0
0
0存入
r
e
t
ret
ret,之后输出;
(5)
n
n
n的位数没除尽则进行循环
(6)当前位数与
f
l
a
g
flag
flag都为
0
0
0时,不会存入
r
e
t
ret
ret内
(7)消去一位
💥 [NOIP1999 普及组] Cantor 表biu~
☘️ 题目描述☘️
现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
1 / 1 1/1 1/1 , 1 / 2 1/2 1/2 , 1 / 3 1/3 1/3 , 1 / 4 1/4 1/4, 1 / 5 1/5 1/5, …
2 / 1 2/1 2/1, 2 / 2 2/2 2/2 , 2 / 3 2/3 2/3, 2 / 4 2/4 2/4, …
3 / 1 3/1 3/1 , 3 / 2 3/2 3/2, 3 / 3 3/3 3/3, …
4 / 1 4/1 4/1, 4 / 2 4/2 4/2, …
5 / 1 5/1 5/1, …
…
我们以 Z 字形给上表的每一项编号。第一项是 1 / 1 1/1 1/1,然后是 1 / 2 1/2 1/2, 2 / 1 2/1 2/1, 3 / 1 3/1 3/1, 2 / 2 2/2 2/2,…
输入格式
整数 N N N( 1 ≤ N ≤ 1 0 7 1 \leq N \leq 10^7 1≤N≤107)。
输出格式
表中的第 N N N 项。
样例 1
样例输入 1
7
样例输出 1
1/4
🤔一、思路:
(1)可以得出规律:
1)行数与该行拥有数字的数量一致,并依次递增,可知第
N
N
N项数在图中第几行的,第几位
2)奇偶行分子分母位置相反,可用
i
f
if
if语句进行判断
😎二、源码:
#include <iostream>
using namespace std;
int x, y; //(1)
int n; //(2)
int row = 1; //(3)
int shift; //(4)
int main() {
scanf("%d", &n);
while (n > row) { //(5)
n -= row;
row++;
}
shift = n;
if (row % 2) { //奇数 //(6)
x = row - shift + 1;
y = shift;
printf("%d/%d", x, y);
} else { //偶数
x = shift;
y = row - shift + 1;
printf("%d/%d", x, y);
}
return 0;
}
😮三、代码分析:
(1)分子,分母
(2)第n项数
(3)行
(4)移动数
(5)若
n
>
r
o
w
n>row
n>row,则寻找
n
n
n所在
r
o
w
row
row行
(6)判断所在行是奇数还是偶数,分子与分母在所在行的位置上移动
s
h
i
f
t
shift
shift或
r
o
w
−
s
h
i
f
t
+
1
row-shift+1
row−shift+1
🤗 鸡汤来咯:
生活就像海洋,只有意志坚强的人,才能到达彼岸