Digital Roots 杭电1013

本文记录了一道ACM编程挑战赛题目的解决过程,从最初错误的尝试到最终正确的解答,分享了作者的心得体会及代码实现,强调了对于输入范围的考虑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一道acm水题做得和尼玛一坨屎一样,真尼玛去shi算求了!!

开始一直忽略了一个问题,这尼玛N可以是无限大的啊!!

第一遍:打算用stl来做加个递归,shi一样的代码。报错:Runtime Error (STACK_OVERFLOW)

#include <cstdio>
#include <iostream>
#include <string>
#include <string.h>
using namespace std;

int digital (const string &);
const int MAX_N = 1000000;

int main ()
{
    int N;
    char buf[MAX_N];
    memset(buf, 0, MAX_N);
    while (cin >> N && N != 0)
    {
        sprintf (buf, "%d", N);
        string digits(buf);
        digital (digits);
    }
    return 0;
}

int digital (const string &digits)
{
    string str = digits;
    int sum = 0;
    char buf[MAX_N];
    memset (buf, 0, MAX_N);
    for (int i = 0; i < str.size(); i++)
    {
        sum += str[i] - '0';
    
    }
    if (sum / 10 == 0)
    {
      cout << sum << endl;
      return 0;
    }
    else
    {
        sprintf (buf, "%d", sum);
        string word(buf);
        digital(word);
    }
}

第二遍:直接用的递归,结果尼玛报错,哎,N是无限大的啊,报错:Out Of Contest Time

#include <cstdio>
#include <iostream>
using namespace std;

int digital ( int );

int main ()
{
    int N;
    while (cin >> N && N != 0)
    {
        digital (N);
    }
    return 0;
}

int digital ( int N)
{
    int sum = 0, n = 0;
    if (N / 10 == 0)
    {
      cout << N << endl;
      return 0;
    }
    else
    {
        while (N > 0)
        {
            n = N % 10;
            sum += n;
            N = N / 10;
        }
        digital (sum);
    }
}

第三遍:别人提醒了下,恍然大悟,ac,我在想我尼玛这脑袋是不是有点傻啊!人艰不拆啊!再不下点功夫,这尼玛真的要废了,My泪滴嘎嘎!!!

#include <iostream>
using namespace std;

int main ()
{
	string digit;
	while (cin >> digit)
	{
		int sum = 0;
		for (int i = 0; i < digit.size(); i++)
		{
			sum += digit[i] - '0';
			if (sum > 9)
			  sum = sum / 10 + sum % 10;
		}
		if (sum == 0)
		  break;
		cout << sum << endl;
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值