求解释一行代码,该如何处理
求解释一行代码
题目是求数根,将一个数的每一位加起来,如果这个和是一个一位数,那么就是它的数根,若不是一位数,则对其和的每一位继续求和,直到这个和为一个一位数,
例如:23 -> 5
78 -> 15 -> 6
55555 -> 25 -> 7
有人写出了这么个算法,我数学很差劲,居然想不通原理是什么,求解释
------解决方案--------------------
其实要解这个题目,主要是从个位开始往上加。打个比方说:1234,先是4,然后是123+4=127;7就是3和4相加,依次类推,就有12+7=19,9=3+4+2;1+9=10,10=1+2+3+4;给出的程序中,s应该是int型的,s%10是取最后一位的数字
------解决方案--------------------
题目是求数根,将一个数的每一位加起来,如果这个和是一个一位数,那么就是它的数根,若不是一位数,则对其和的每一位继续求和,直到这个和为一个一位数,
例如:23 -> 5
78 -> 15 -> 6
55555 -> 25 -> 7
有人写出了这么个算法,我数学很差劲,居然想不通原理是什么,求解释
- Python code
s = 345435435435 while s > 9: s = s // 10 + s % 10 print(s)
------解决方案--------------------
其实要解这个题目,主要是从个位开始往上加。打个比方说:1234,先是4,然后是123+4=127;7就是3和4相加,依次类推,就有12+7=19,9=3+4+2;1+9=10,10=1+2+3+4;给出的程序中,s应该是int型的,s%10是取最后一位的数字
------解决方案--------------------
- C/C++ code
#include <stdio.h> int main(){ long unsigned int s = 345435435435; while (s > 9) s = s / 10 + s % 10; printf("%d\n",s); return 0; }
------解决方案--------------------
不懂python
但是算法应用是一个数超过9就递归取余,然后对余数求和
------解决方案--------------------
c++版本
- C/C++ code
#include <iostream> using namespace std; int main() { unsigned int num; cout<<"Input an unsigned int num:"; cin>>num; while (num >= 10) { num = num / 10 + num % 10; } cout<<num<<endl; return 0; }
------解决方案--------------------
- C/C++ code
#include <iostream> using namespace std; int main() { unsigned int num; cout<<"Input an unsigned int num:"; cin>>num; while (num >= 10) { num = num / 10 + num % 10; } cout<<num<<endl; return 0; } //比如789:(700+80+9)/10 = 70 + 8 + 0;(700+80+9)%10 = 0 + 0 + 9; //(70 + 8 + 9)/10 = 7 + 0 + 0;(70 + 8 + 9)%10 =0 + 8 + 9; //此时num= 7 + 8 + 9;
------解决方案--------------------
数学差劲的逐位相加
数学好点的直接对9求余
------解决方案--------------------
小于等于9的数字,数根就是它本身,即当一个数小于等于9的时候,它的数根等于它对9求余
大于等于10的数字,使用数学归纳法,(a*10+b)=(a*9)+(a+b)
可见(a*10+b)和(a+b)对9求余的结果是相等的,若(a+b)小于等于9,则它就是所求数根,否则重复对9求余
对9求余结果为0,则数根为9,否则数根为所得余数,完毕