这道题花的时间也挺长的,主要的问题还是边界与特例没想明白,有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;
}