HDU1013 POJ1519 Digital Roots

该问题的最佳解法是利用数论的9余数定理来计算数根。一个数的数根等于该数的9的余数,若余数为0则结果为9。

问题链接HDU1013 POJ1519 Digital Roots基础训练题,用C语言编写程序。

问题简述:输入若干正整数,求其数根,直到输入为0为止。

问题分析:数根是指整数的各个位的数字之和。如果其和为1位整数,则为结果;如果其和为多位整数,则再将各位数字相加,直到其和为1位数为止。这个问题的大陷阱是,没有指出整数是多少位的。即使使用unsignde long long类型,也可能会溢出的。所以,需要按字符串来处理。

程序说明:(略)。

实际上可以一边读入数据一边处理,省去字符串数组,参见:HDU1013 POJ1519 Digital Roots(解法二)

另外一个版本参见:HDU1013 POJ1519 Digital Roots(解法三)

AC的C语言程序如下:

/* HDU1013 POJ1519 Digital Roots */

#include <stdio.h>

int main(void)
{
    char s[1024], *p;
    int digitroot;

    while(~scanf("%s",s)) {
        // 判断结束条件
        if(s[0] == '0')
            break;

        // 计算数根
        p = s;
        digitroot = 0;
        while(*p) {
            // step1 计算各位数字之和
            digitroot += *p++ - '0';

            // step2 每个10都变为1
            digitroot = digitroot / 10 + digitroot % 10;
        }

        // 输出结果
        printf("%d\n", digitroot);
    }

    return 0;
}



转载于:https://www.cnblogs.com/tigerisland/p/7564639.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值