Расчет Digital Root, есть ли лучший способ? - PullRequest
2 голосов
/ 29 июня 2009

Так я вычислил цифровой корень целого числа.


import acm.program.*;

public class Problem7 extends ConsoleProgram
{
    public void run()
    {
        println("This program calculates the digital root of an interger.");

        int num = readInt("Enter the number: ");
        int sum = 0;
        while (true)
        {
            if (num > 0)
            {
                int dsum = num % 10;
                num /= 10;
                sum += dsum;
            }
            else if (sum > 9)
            {
                int dsum = sum % 10;
                sum /= 10;
                sum += dsum;

            } else if (sum <= 9 ) break;
        }
        println("Digital Root is: " + sum);
    }

Программа отлично работает.

Есть ли лучший / более короткий способ вычисления цифрового корня числа.


РЕДАКТИРОВАТЬ / ДОБАВЛЕНО: Вот реализация вышеуказанной проблемы с использованием ответа Тайлер , он также работает:


import acm.program.*;

public class Problem7 extends ConsoleProgram
{
    public void run()
    {
        println("This program calculates the digital root of an interger.");

        int num = readInt("Enter the number: ");
        println("Digital Root of " + num + " is: " + (1 + (num - 1) % 9));
    }
}

Ответы [ 7 ]

15 голосов
/ 29 июня 2009
#include <stdio.h>

int main(void)
{
   int number;
   scanf("%d", &number);

   printf("The digital root of %d is %d.", number, (1 + (number - 1) % 9));
}

Если бы я не смог найти формулу Рамана, я бы написал эту программу ...:

#include <stdio.h>
#include <ctype.h>

int main(void)
{
    int c;
    int number = 0;
    while ((c = getchar()) != EOF)
    {
        if (isdigit(c))
            number += (c - '0');
    }
    if (number <= 9)
    {
        printf("The digital root is %d\n", number);
    }
    else
    {
        printf("%d", number);
    }

}

После компиляции, чтобы запустить это, в основном вы просто соединяете их вместе. Я думаю, что четыре - это максимум, что вам может понадобиться для целого числа.

$ echo 829382938 | ./digitalroot | ./digitalroot | ./digitalroot | ./digitalroot
2 голосов
/ 29 июня 2009

Лично мне не нравится ваш цикл, который, по сути, состоит из двух циклов (сначала перебирая исходные цифры, затем перебирая цифры суммы), соединенных в одну. Как насчет посыпания рекурсии:

private int sumDigits(int in){
   if (i>10)
      return in%10 + sumDigits(in/10);
    return in;
}

private int digitalRoot(int in){
    assert (in > 0) ;
    while (in > 9)  in=sumDigits(in);
    return in;
}
1 голос
/ 13 июня 2012

Я думаю, что я нахожусь на одном месте в классе, нет рекурсии или каких-либо умеренно продвинутых идей (я супер новичок) Я использовал

public void run() {
    println("This program finds the digital root of an integer.");
    int n = readInt("Enter a positive integer: ");
    int dsum = 0;
        while (n>0) {
            dsum += n % 10;
            n /= 10;
            if ((n==0) && (dsum>9)) {
                n = dsum;
                dsum = 0;
            }   
        }
    println("The digital root of the integer is " + dsum);
}
0 голосов
/ 08 октября 2017

Вот самое короткое решение, которое я нашел, которое подходит для всех случаев использования.

public int digRoot(int num) {
        num = 1015; {
        return (1+(num-1)%9);
        }
}

ref: https://dgeekspot.wordpress.com/2015/11/17/digital-root-algorithm/

0 голосов
/ 03 сентября 2017

Wolfram Alpha потрясающий. Это в значительной степени кормило меня следующим решением:

int getDigitalRoot(int n, int base){
      return (1+(n-1)%base); }

int getDigitalRoot(int n){
      return (1+(n-1)%9); }

Это решение O (1), без циклов или рекурсии.

0 голосов
/ 21 июля 2016
public static void main(String[] args)


{
int n;
Scanner scan=new Scanner(System.in);
System.out.println("Enter the no. of which you want to find the digital root");
n=scan.nextInt();
System.out.println(n%9);
}
0 голосов
/ 29 июня 2009

Я бы взял вход в качестве строки вместо этого. Таким образом, вы можете просто перебрать String и использовать Integer.parseInt (), чтобы захватить каждое число и добавить их. Вы можете снова преобразовать это число в строку и пройтись по коду, чтобы получить цифровой корень.

public void run()
{
    println("This program calculates the digital root of an interger.");

    String num = readLine("Enter the number: ");
    int sum = 10;
    while (num > 9) {
      for (int x = 0; x < num.length(); x++) {
         sum = Integer.parseInt(num.charAt(x));
      }
      num = Integer.toString(sum);
   }
   println("Digital Root is: " + sum);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...