开始的时候没有考虑大数的问题,后面知道测试数据有大数的时候注意下就可以了
#include<iostream>
#include<string>
using namespace std;
short num[10000], tnum[10000];//num存储每一次计算的结果,tnum存储每一次计算的中间结果,数组每一位存储计算结果的一位数字
string input;
int pos = 0;//当前中间计算结果tnum共有几位,也作为每一次计算结果的位数进行参数传递
void solve(int n)
{
pos = 0;
if (n==0)//如果计算结果中只有一位数字时,输出结果,结束计算
cout << num[0] << endl;
else
{
for (int i = 0; i <= n;i++)//每一数据位数字累加
{
tnum[0] += num[i];
for (int j = 0; j <= pos;j++)//判断是否有进位
{
if (tnum[j] >= 10)
{
tnum[j + 1] += tnum[j] / 10;
tnum[j] = tnum[j] % 10;
}
else
break;
}
if (tnum[pos + 1] > 0)//计算结果位数又增加一位
{
pos++;
tnum[pos+1]=tnum[pos]/10;
tnum[pos] %= 10;
}
}
memcpy(num, tnum, sizeof(num));
memset(tnum, 0, sizeof(tnum));
solve(pos);//再次递归调用
}
}
int main(int argc, char* argv[])
{
while (cin >> input&&input[0] != '0')
{
memset(num, 0, sizeof(num));
memset(tnum, 0, sizeof(tnum));
for (int i = 0; i < input.size(); i++)
num[i] = input[i] - '0';
solve(input.size()-1);
}
return 0;
}
hdoj1013_Digital Roots
最新推荐文章于 2021-04-08 17:14:58 发布