【LeetCode-258】Add Digits(C++)

本文介绍了一种简单而高效的算法,用于计算任意非负整数的数字根,即通过重复相加该数各位上的数字直到得到个位数。通过利用数学原理,可以避免复杂的循环操作,实现时间复杂度为O(1)的计算。

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

题目要求:给出一个非负整数num,重复的将num各个位上的数字加在一起,一直得到的结果是个位数。

                   如:num=38,则3+8=11,1+1=2。最后得到个位数字2.

                   令:你可以不用循环和递归完成这道题吗?并要求其时间复杂度为O(1)

解题思路:方法1:本来我是按照最一般的方法来做的,就是将38转换为字符串,然后字符串上的各个字符转换为数字相加,加到一起之后再转换为字符串,判断字符串的字符                                    数是不是1,如果是就结束,不是的话继续循环。

                    方法2:这种方法就比较简单了,这种方法是用了一个规律:任意一个整数关于9取余就等于这个整数各个位的数加在一起的数关于9取余。即:

                                  设自然数N=a[n]a[n-1]…a[1]a[0],其中a[0]、a[1]、…分别是N的个位,十位…上的数。再设M=a[0]+a[1]+…+a[n]。则M mod 9=N mod 9。

                                  证明:
                 ∵ N=a[n]a[n-1]…a[0]=a[n]*10^n+a[n-1]*10^(n-1)+…+a[1]*10+a[0].
                 又∵ 1 mod 9=1 mod 9, 

                          10 mod 9=1 mod 9,

                          10 mod 9=1 mod 9,

                                           … 

                         10^n mod 9 =1 mod 9.
                上面这些等式两边分别同乘以a[0]、a[1]、a[2]、…、a[n],再相加得:
             a[0]+a[1]*10+…+a[n]*10^n≡(a[0]+a[1]+…+a[n])(mod 9),
             即 M mod 9=N mod 9,得证。

                   根据上面的定理我们可知,重复的将num的各个位上的数字加在一起,不管加了多少次得到的数字关于9取余都是相等的,都等于最后得到的个位                    数字,即38 mod 9=11 mod 9 =2 mod 9 =2。也就说这个过程中得到的各个数是关于9同余的。所以我们只需要把num关于9取余就可以得                    到结果了,但是要注意当余数为0时应当返回9。

程序实现:方法1:

class Solution {
public:
	int addDigits(int num) {
		string s = num2str(num);
		int n;
		while (s.size()>1){
			n = 0;//一开始写程序的时候忘记每次循环的过后要把n置零了,导致程序超时,结果错误。
			for (int i = 0; i < s.size(); i++){
				n = n + (int) s[i] - 48;
			}
			s = num2str(n);	
		}
		return (int) s[0] - 48;
	}
	string num2str(int i){
		stringstream ss;
		ss << i;
		return ss.str();
	}
};
            方法2:

class Solution {
public:
	int addDigits(int num) {
		if(num==0)
		   return 0;
		else
		   return num%9==0?9:num%9;
	}
};
当然也可以直接return 1+(num-1)%9;

总结:在方法1上面浪费了很多时间,一开始以为是string.size()返回值不是整形的所以与有符号的整形数1进行比较会出问题,所以才没办法跳出循环,但是单步执行了一下才发行是因为每次循环过后没有将n置零,这样就会在上一次循环过后的n值叠加到结果上面,所以就会出问题。不过学会了怎么调试怎么加断点怎么单步执行。方法2是上网上搜了一下才知道这个规律的,这种加的方法得到的数称为digital root 数字根。

参考

     http://www.cnblogs.com/Rinyo/archive/2012/12/20/2826755.html

     http://blog.youkuaiyun.com/xudli/article/details/47786855


              

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值