一个数的泛根被定义为一个数的位数之和,直到我们得到一个数字。例如:
456的泛根:4+5+6= 15,因为15是两位数,所以1+5=6
因此,456的泛根=6
我通过递归地添加数字的数字解决了这个问题,直到得到一个数字,并且程序运行良好。我在网上搜索,找到了一个我无法理解的非常小的解决方案:
#include<stdio.h>
int main()
{ int n,x;
printf("Enter no");
scanf("%d",&n);
printf("Generic root: %d",(x=n%9)?x:9);
return 0;
}我不能理解三元运算符是如何在这里工作的!?它是如何计算一个数的泛型根的
发布于 2013-05-27 17:50:14
N模数9返回其根或0,在这种情况下,根是9。
所以(x=n%9)?x:9的意思是,如果n mod9是0,那么赋值9。
您也可以在没有三元运算符的情况下实现这一点:
x = 1+((n-1)%9)模数9的技巧被称为。
发布于 2013-05-27 17:53:01
这是一个数学技巧:十进制数的“泛型根”与原始数字本身的模9相同。唯一的问题是,如果数字实际上是9的倍数,则C表达式n % 9的计算结果将为0。
所以现在让我们解开三元组:
x = n % 9;
y = ((x != 0) ? x : 9);因此,如果x是零,我们得到y=9,否则我们得到y=x。结合原始的数学技巧,这就是我们想要的。
maths
这也很有趣:但我不会深入讨论--诀窍是证明10的所有幂都与1/ 9同余。
发布于 2013-05-27 19:24:17
数学意义上的技巧的解释是在模算术的属性中:
a number, say 456 == 4*100 + 5*10 + 6
OTOH (a+b) mod N == ((a mod N) + (b mod N)) mod N (1)
AND (a*b) mod N == ((a mod N) * (b mod N)) mod N (2)从这一点来看,
456 mod 9 ==((4 mod 9)*(100 mod 9) +
(5 mod 9)*(10 mod 9) +
(6 mod 9)*(1 mod 9)) mod 9将公式(2)替换为权重(1mod9),(10mod9),(10^n mod9),可以得到每个数字只对中间和贡献自己的权重。该和(模9)可以迭代地计算,直到只有一个数字,并且数字0被单独处理。这也是代码片段中三元操作的用途。
https://stackoverflow.com/questions/16770465
复制相似问题