基础算法——模拟

这个题考察的也是基础的算法--模拟,一般在竞赛中这种算法是算是最简单的了,通俗的讲就是不需要任何硬性的要求,就是照葫芦画瓢,按照题中给我们的要求进行完成。

首先我们看这道题的测试数据的要求的大小是远远超过long long类型 ,所以我们也不能简单的直接就是用longlong类型的两个变量直接相加就输出了,这样做的话你只会得到40分,如果我们想要拿到满分的话,我们可以采用数组的思想解决这一道题。

1.首先我们需要定义数组(这里我自己定义的是3个数组):

int a[1000001], b[1000001], c[1000001], j;
char s[1000001], ss[1000001];

这里我定义的是5个数组,也可以按照别的方法进行定义(但是需要注意的是我们需要对这几个数组进行初始化-----这里我们用的是memset函数<自己不是很熟悉的去自己去查一下>)

    memset(a, 0, sizeof(a));
    memset(b, 0, sizeof(b));
    memset(c, 0, sizeof(c));  // 初始化

然后我们的开始接受输入这里我们接受是字符串类型的---注意 

​​​​我这里让a和b这两个数组的第一个元素都储存的是两个相加的长度---a[0], b[0]

    a[0] = strlen(s);
    b[0] = strlen(ss);        // 获取长度

然后我们需要对其接受的字符数组的每一元素进行转化(每一个元素ASCII码减去'0'的)

而且这里我们需要转换变量的顺序(因为我们是从个位进行操作)

    for(int i = 1; i <= a[0]; i++) a[i] = s[a[0] - i] - '0'; // 转化成数字
    for(int i = 1; i <= b[0]; i++) b[i] = ss[b[0] - i] - '0';

接下来我们开始相加

    for(j = 1; j <= max(a[0], b[0]) + 1; j++)
    {
        c[j] = a[j] + b[j];
        if(c[j] >= 10)
        {
            c[j] %= 10;
            a[j + 1]++;
        }
    }

这里的重点是----加一当两个数的最高位都相同有可能会进一,所以这里会有一个进一,但后我是把相加后数字转换到了c数组中。

最后就是输出了,这里我们遇到的了最后一个问题就是怎样确定相加后的数的最高位(然后我自己利用的是使用两个限制它)

    c[0] = j;
    if(c[j + 1] > 0) c[0]++; // 感觉没有必要
    for(int i = c[0]; i >= 1; i--)
    {
        if(x == false && c[i] == 0) continue;  // 一重保险
        x = true;
        cout << c[i];
    }

这里我们有一个额定的判位(但是我自己感觉没有啥必要, 因为进完位最高就是 j )

这里我们使用一个bool判断最高位 一旦第一个不为零的数出现了以后,后面这个判断就都不会成立了

最后的代码贴上来:

#include <bits/stdc++.h>
using namespace std;
int a[1000001], b[1000001], c[1000001], j;
char s[1000001], ss[1000001];
bool x = false;
int main()
{
    memset(a, 0, sizeof(a));
    memset(b, 0, sizeof(b));
    memset(c, 0, sizeof(c));  // 初始化
    scanf("%s%s", s, ss);     // 读入两个数;
    a[0] = strlen(s);
    b[0] = strlen(ss);        // 获取长度
    for(int i = 1; i <= a[0]; i++) a[i] = s[a[0] - i] - '0'; // 转化成数字
    for(int i = 1; i <= b[0]; i++) b[i] = ss[b[0] - i] - '0';
    for(j = 1; j <= max(a[0], b[0]) + 1; j++)
    {
        c[j] = a[j] + b[j];
        if(c[j] >= 10)
        {
            c[j] %= 10;
            a[j + 1]++;
        }
    }
    c[0] = j;
    if(c[j + 1] > 0) c[0]++; // 感觉没有必要
    for(int i = c[0]; i >= 1; i--)
    {
        if(x == false && c[i] == 0) continue;  // 一重保险
        x = true;
        cout << c[i];
    }
    if (x == false) cout << 0; // 二重保险
    cout << endl;
    system("pause");
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值