【问题标题】:Generic root of a number in cc中数字的一般根
【发布时间】:2013-05-27 09:46:45
【问题描述】:

一个数字的通用根被定义为一个数字的数字之和,直到我们得到一个数字。 例如:

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;
}

我无法理解三元运算符在这里的工作原理!?它如何计算一个数字的通用根

【问题讨论】:

  • 或者可以定义为 n mod 9。(三元运算符修复了 n % 9 == 0 时的情况)
  • 表示 (x=n%9) != 0 ? x : 9
  • 我认为 OP 已经弄清楚了 (x=n%9)?x:9 在 C 中的含义。OP 可能正在研究这条线是如何计算根的,换句话说,OP 正在寻找这个定理的证明。

标签: c


【解决方案1】:

一个数字 n 模 9 返回它的根或 0,在这种情况下,根是 9。

  1. 计算 n % 9 得到根
  2. 如果结果为 0,则根为 9

所以(x=n%9)?x:9 表示如果 n mod 9 为零,则赋值为 9。

不用三元运算符也可以实现:

x = 1+((n-1)%9)

模数为 9 的技巧称为 congruence formula

【讨论】:

  • 这是我们在小学时想知道一个数字是否能被 9 整除的技巧。
  • 顺便说一句,公式 1+((n-1)%9) 给出了正确的答案,即使是 n = 0,而在这种情况下,hack (x=n%9)?x:9 是不正确的
【解决方案2】:

这是一个数学技巧:十进制数的“通用根”与原始数本身模 9 相同。唯一的问题是如果该数实际上是 9 的倍数,C 表达式 n % 9 将计算为零。

现在让我们解开三元组:

 x = n % 9;
 y = ((x != 0) ? x : 9);

因此如果x 为零,我们得到y=9,否则我们得到y=x。结合原来的数学技巧,这就是我们想要的。

数学

这也很有趣:但我不会深入讨论——诀窍是证明 10 的所有幂都与 1 模 9 相等。

【讨论】:

  • 基本上,由于 10**n == 1 mod 9,那么十进制数中的每个数字都只对 mod-9 版本贡献自己的值。
  • 输入为0,也应该有特殊情况,否则结果是错误的。
  • @glglgl 如果原始输入为零,这应该一切正常。实际上 0 是 9 的倍数,在某种意义上是 0 == 0%9
【解决方案3】:

这个技巧在数学意义上的解释是在模算术的性质中:

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) 代入权重 (1 mod 9), (10 mod 9), (10^n mod 9),可以得出每个数字仅对中间和贡献其自身的权重。作为回报,该总和(模 9)可以迭代评估,直到只有一个数字并且数字 0 被单独处理。这也是代码片段中的三元运算的作用。

【讨论】:

    【解决方案4】:

    除以 9 的除法标准是数字之和必须能被 9 整除。递归地执行此操作,您会得到一个结果,即能被 9 整除的数的通用根为 9。

    通过模运算,您可以计算出您与 9 的倍数之间的距离,这个距离也是该数字的一般根。如果你拿一张纸按顺序写出泛根,你会看到它们每个数字都加 1,9 之后是 1。

    还有一个特殊情况你必须考虑,0。谁可以被 9 整除但没有 9 的通用根(它是唯一一个通用根为 0 的数字)。

    【讨论】:

      【解决方案5】:

      伙计们,我发现 (x=n%9)?x:9 难以理解。仔细检查 if 条件。注意:我们输入的数字必须大于 10。

      int main()
      {
      
      int n;
      
      printf("Enter number...");
      scanf("%d",&n);
      if(n%9==9)
          {
          printf("The generic root of the number is : 9");
      
          }
      else if(n%9!=0)
      {
          printf("The generic root of the number is : %d",n%9);
      }
      return 0; 
      }
      

      【讨论】:

        【解决方案6】:

        简单来说,数学技巧是:

        15 % 9 = 6-- 1+5=6
        14 % 9 = 5-- 1+4=5
        18 % 9 = 0-- 1+8=9
        

        在这个概念中它有效

        if x != 0 it return x value
        if x == 9 it returns the value 9 
        printf("Generic root: %d",(x=num%9)?x:9);
        

        【讨论】:

          猜你喜欢
          • 2021-04-17
          • 1970-01-01
          • 1970-01-01
          • 2011-06-07
          • 2010-12-10
          • 1970-01-01
          • 2015-06-26
          • 1970-01-01
          • 2011-04-29
          相关资源
          最近更新 更多