跟着《程序设计竞赛专题挑战教程》来备战~
书是23年3月买的,但是当时还是大一,看不懂hh;
今年参加蓝桥省赛之前,简单看了看,是本好书,但是当时还是很忙hh
备战国赛,打算跟着系统学一学,不求拿奖,能学到哪儿算哪儿。
1.高精度加法
原题链接
https://www.lanqiao.cn/problems/1516/learning/
题目描述
给定两个整数 a 和 b,请你求出这两个整数的和。
输入描述
输入两个正整数 a,b,a 和b都不超过 100 位。
输出描述
输出 a +b。
输入输出样例
示例
输入
1234567890123456789
9876543210987654321
输出
11111111101111111110
5月9日开始备战蓝桥国赛~ 打卡
拿高精度开刀^^
这道题是高精度加法,每个位上的数相加,如果和大于等于10,则需要更新p[i],于此同时,p[i+1]加上进位的1。另外a 和 b可能位数不一样,所以可以在开头用append()函数让两个数的位数一样
C++
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 110;
int p[N],i;
int main(){
string a,b;
cin>>a>>b;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
int x = max(a.size(),b.size());
a.append(x - a.size(),'0');
b.append(x - b.size(),'0');
for(i = 0;i < a.size() || i < b.size();i++)
{
p[i] = p[i] + (a[i] - '0') + (b[i] - '0');
if(p[i] >= 10) {
p[i] = p[i] - 10;
p[i + 1] += 1;
}
}
if(p[i] == 0) i = i - 1;
for(int j = i;j>=0;j--)
cout<<p[j];
return 0;
}
2.阶乘计算
原题链接
题目描述
给定一个正整数 n,求出 n! 的值。
输入描述
输入一个正整数 n,n <= 1000。
输出描述
输出 n!。
输入输出样例
示例
输入
10
输出
3628800
这个题目是高精度乘法,也是需要注意进位的问题。利用双重循环,外层循环是从1到n,内层负责处理数组的进位问题
C++
#include <iostream>
using namespace std;
const int N = 10000;
int a[N], carry, j;
int main()
{
int n;
cin >> n;
a[0] = 1;
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < N; j++)
{
a[j] = a[j] * i + carry;
carry = a[j] / 10;
a[j] = a[j] % 10;
}
}
int first;
for (int i = N - 1; i >= 0; i--)
if (a[i] != 0)
{
first = i;
break;
}
for (int i = first; i >= 0; i--)
cout << a[i];
return 0;
}
3.回形取数
原题链接
题目描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入描述
输入第一行是两个不超过 200 的正整数 m,n,表示矩阵的行和列。接下来m 行每行 n 个整数,表示这个矩阵。
输出描述
输出只有一行,共 mn 个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
输入输出样例
示例
输入
33
1 2 3
4 5 6
8 9
输出
1 4 7 8 9 6 3 2 5
在纸上画画写写 找找规律~
四个for循环,第一个for循环是从左往右(列);第二个for循环是从下到上(行);第三个for循环是从右往左(列);第四个for循环是从上到下(行)
斯,有点抽象,你可以把这四个for循环想象成剥洋葱,从最外面一层开始剥,慢慢往里
举例一下:第一个for循环把第一列剥下来了,第二个for循环把第m行拨下来了,第三个for循环把第n列剥下来了,第四个for循环把第一行播下来了;这样第一层洋葱就剥下来了,按照这个规律,依次往里剥。
当然,要注意一下特殊情况,比如如果m + n 是个偶数,洋葱的芯(最最最中心的元素)是输出不出来的,你还要最后再手动输出一下子~
C++
#include <iostream>
using namespace std;
const int N = 40010;
const int M = 210;
int a[M][M], b[N], f = 1;
int re[N], k;
int main()
{
int m, n;
cin >> m >> n;
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++)
cin >> a[i][j];
while (1)
{
for (int i = f; i < m - f + 1; i++)
re[k++] = a[i][f];
for (int j = f; j < n - f + 1; j++)
re[k++] = a[m - f + 1][j];
for (int i = m - f + 1; i > f; i--)
re[k++] = a[i][n - f + 1];
for (int j = n - f + 1; j > f; j--)
re[k++] = a[f][j];
f++;
if (f > m / 2)
break;
}
if ((m + n) % 2 == 0)
re[k] = a[m / 2 + 1][n / 2 + 1];
cout << re[0];
for (int i = 1; i <= k; i++)
cout << " " << re[i];
return 0;
}