针对CSP-J/S的每日一练:Day9
一、审题
题目描述
众所周知,光年是一种距离单位,1光年=9460730472580800米。今年5月6日,天文学家在最新一期《天文学与天体物理学》杂志上称,他们发现了一个距离地球只有1000光年的黑洞,这是迄今为止在肉眼可见的恒星系统中发现的距离地球最近的黑洞。即该黑洞距离地球只有9460730472580800米。为了能直观的表现出天体之间的庞大距离,请你设计一个换算器,输入光年数,输出对应的米数。
输入描述
1行。包含一个整数n,代表光年数。
输出描述
1行,即n光年的米数。
样例1
输入
1输出
9460730472580800
样例2
输入
2输出
18921460945161600
提示
对于100%的数据,1<=n<=10000000。
二、思路提示
按照C++高精度乘法的【高精度数 × 低精度数】模块,我们使用n来存储低精度数,a_int[]来存储高精度数。
- 遍历int_a,先在ans[]数组中存储真实的计算结果,然后提取进位,并且在ans[]数组中只保留个位。
- 在逆序输出之前,进行最高位的处理(如果进位不是0,那么要在ans[]数组中先存储进位,然后将进位 ÷ 10,因为进位有可能是一个多位数)。
三、代码实践
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
// 输入光年数
int n;
cin >> n;
// 转换进率
char a_str[1005] = "9460730472580800";
int a_int[1005] = {};
int len_a = strlen(a_str);
for (int i = 0; i <= len_a-1; i++)
{
a_int[len_a-i-1] = a_str[i] - 48;
}
// 计算结果
int ans[1005] = {};
int len_ans = len_a;
int in = 0;
for (int i = 0; i <= len_ans-1; i++)
{
ans[i] = a_int[i] * n + in;
in = ans[i] / 10;
ans[i] %= 10;
}
// 去前导0
while (in)
{
ans[len_ans] = in % 10;
in /= 10;
len_ans++;
}
// 正常倒序输出
for (int i = len_ans-1; i>= 0; i--)
{
cout << ans[i];
}
return 0;
}