Общий корень из числа в c

Общий корень числа определяется как сумма цифр числа, пока мы не получим одну цифру. Например:

Общий корень 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;
}

Я не могу понять, как здесь работает троянский оператор!? Как он вычисляет общий корень из числа

Ответ 1

Число n модуль 9 возвращает либо его корень, либо 0, в этом случае корень равен 9.

  • Вычислить n% 9 для получения корня
  • Если результат равен 0, то корень равен 9

Итак, (x=n%9)?x:9 означает, что если n mod 9 равно нулю, назначьте 9.

Вы также можете достичь этого без тройного оператора:

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

Трюк модуля 9 называется формулой конгруэнции.

Ответ 2

Это математический трюк: "общий корень" десятичного числа совпадает с самим исходным номером по модулю 9. Единственная проблема заключается в том, что число на самом деле кратно 9, выражение C n % 9 будет оценивать до нуля.

Итак, теперь распакуйте тройку:

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

Таким образом, если x равно нулю, мы получаем y=9, иначе получим y=x. В сочетании с оригинальным математическим трюком это то, что мы хотим.

Математика:

Это тоже интересно: но я не буду вдаваться в это - трюк заключается в том, чтобы доказать, что все степени 10 соответствуют 1 по модулю 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.

Выполняя операцию modulo, вы вычисляете, как далеко вы находитесь от кратного 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);