Have Fun with Numbers

这道题花的时间也挺长的,主要的问题还是边界与特例没想明白,有20位的数不能直接用int表示,long long类型也只能保存20位数,不能保证21位数,所以到了20位9翻倍有21位时就会出问题,这个边界我错了两次,一次20位,一次21位。然后是翻转的边界问题也想岔了,还有就是20位进位到21位这种情况也想漏了。感觉算法题的难点就是思考边界与列举不同情况,假设一个人可以很想明白边界问题和想到所有的情况,那么算法题就会变轻松很多,遇见边界问题和检测不同情况,暂时最好的办法就是举例子与一步步地调试,还有就是在写代码前一定要先动笔把思路理顺了,要不然会出现很多意料之外的错误。

#include<iostream>
using namespace std;
void count_up(long long x, int a[]);
void count_up(int x[], int a[]);
void double_array(int x[], int a[]);
void convert_array(char x[], int a[]);
int main()
{
    char x1[21];
    cin.get(x1, 21);
    int count_a1[10] = {0};
    int count_a2[10] = {0};
    int array_x[22] = { 0 };
    convert_array(x1, array_x);
    int double_x[22] = { 0 };
    double_array(array_x, double_x);
    count_up(array_x, count_a1);
    count_up(double_x, count_a2);
    bool isEqual = true;
    for (int i = 0; i < 10;i++)
    {
        if (count_a1[i] != count_a2[i])
        {
            isEqual = false;
        }
    }
    if (isEqual == true)
    {
        cout << "Yes" << endl;
    }
    else
    {
        cout << "No" << endl;
    }

    int cnt = 0;
    int num_digit = 0;
    do
    {
        num_digit++;
        cnt++;
    } while (double_x[cnt+1] != -1);

    cnt = 0;
    do
    {
        cout << double_x[num_digit-cnt];
        cnt++;
    } while (cnt <= num_digit);
    return 0;


}
void convert_array(char x[], int a[])
{
    int cnt = 0;
    int digit = 0;
    int num_digit = 0;
    do
    {
        num_digit++;
        cnt++;

    } while (x[cnt] != '\0');

    cnt = 0;
    do
    {
        digit = x[cnt]-'0';
        a[(num_digit-cnt-1)] = digit;
        cnt++;
    } while (cnt< num_digit);
    a[cnt] = -1;
    
    cnt = 0;

}

void count_up(int x[], int a[])
{
    int digit = 0;
    int cnt = 0;
    do
    {
        digit = x[cnt];
        a[digit]++;
        cnt++;

    } while (x[cnt] != -1 && cnt !=22);

}

void double_array(int x[], int a[])
{
    int cnt = 0;
    int digit = 0;
    int double_digit = 0;
    int single_digit = 0;
    bool isCarry = false;
    do
    {
        digit = x[cnt];
        double_digit = 2 * digit;
        if (double_digit / 10 == 0)
        {
            single_digit = double_digit;
            if (isCarry == true)
            {
                single_digit++;
                isCarry = false;
            }
            isCarry = false;
        }
        else
        {
            single_digit = double_digit % 10;
            if (isCarry == true)
            {
                single_digit++;
                isCarry = false;
            }
            isCarry = true;
        }
        a[cnt] = single_digit;
        cnt++;
    } while (x[cnt] != -1 && cnt != 22);
    if (isCarry == true)
    {
        a[cnt] = 1;
        cnt++;
    }
    a[cnt] = -1;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值