蓝桥之数组篇

跟着《程序设计竞赛专题挑战教程》来备战~

书是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;
}

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值