HDU1013 Digital Roots

在这里插入图片描述

输入结束条件为0;

#include <iostream>
using namespace std;

int main()
{
    int n = -1;
    while (cin>>n && n!=0)
	{
		int sum = 0;
		int root = 0;
		do
		{
			while(n)
			{
				sum += n%10;
				n /= 10;
			}
			root = sum;
			n = root;
			sum = 0;	//每做完一次之后sum重置为0
		}while(!(root>0 && root<9));
		cout << root <<endl;
	}

    return 0;
}

在这里插入图片描述

超时错误

在这里插入图片描述

问题分析:
问题没有指出整数是多少位的,即使使用unsigned long long类型,也有可能会溢出,所以,需要按照字符串来处理。
或者一边读入数据一边处理,省去字符串数组。

#include <iostream>
#include <cstring>
using namespace std;
 
int root(int n)
{
    if(n<10)
        return n;
    int sum = 0;
    while(n)
    {
        sum +=n%10;
        n/=10;
    }
    return root(sum);
}
int main()
{
    int n,sum;
    char a[100];
    while(cin>>a)
    {
        int length = strlen(a);
        if(length==1&&a[0]=='0'){
            break;
        }
        sum = 0;
        for(int i=0; i<length; i++)
        {
            sum +=a[i]-'0';
        }
        cout<<root(sum)<<endl;
    }
    return 0;
}

思路:函数root用递归的方式求出和
逐个读取字符数组中的数字,将其求和,最后带入root函数计算

没通过Runtime Error (ACCESS_VIOLATION)

9余数定理
在这里插入图片描述
整体思路与刚才大致相同,逐个读取每一个字符,并将其转换为数字,相加求和,只是结果的处理有所不同,最后的结果要求是一位小数,那么只需要对结果对9取余即可。注意如果结果为0,相对应的结果为9;

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

int main()
{
	char a[100000];
	int sum;
	while(cin >> a)
	{
		int length = strlen(a);		//求字符串a的长度
		if(length==1 && a[0]=='0')	//退出条件:长度为1或者输入的是0
		{
			break;
		}
		sum = 0;
		for(int i=0; i<length; i++)	//将各位数字加起来 --用字符逐个相加
		{
			sum += a[i] -'0';	//将字符转化为数字
		}
		sum %= 9;
		if(sum == 0)
		{
			sum = 9;
		}
		cout << sum << endl;

	}

    return 0;
}

开一个数组,越界。。。
AC代码

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

int main()
{
	string a;
	int sum;
	while(cin >> a)
	{
		int length = a.size();		//求字符串a的长度
		if(length==1 && a[0]=='0')	//退出条件:长度为1或者输入的是0
		{
			break;
		}
		sum = 0;
		for(int i=0; i<length; i++)	//将各位数字加起来 --用字符逐个相加
		{
			sum += a[i] -'0';	//将字符转化为数字
		}
		sum %= 9;
		if(sum == 0)
		{
			sum = 9;
		}
		cout << sum << endl;

	}

    return 0;
}

暴力求解AC码

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

int root(int n)
{
    if(n<10)
        return n;
    int sum = 0;
    while(n)
    {
        sum +=n%10;
        n/=10;
    }
    return root(sum);
}
int main()
{
    int n,sum;
    string a;
    while(cin>>a)
    {
        int length = a.size();
        if(length==1&&a[0]=='0'){
            break;
        }
        sum = 0;
        for(int i=0; i<length; i++)
        {
            sum +=a[i]-'0';
        }
        cout<<root(sum)<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值