как узнать, является ли данное число факториалом какого-то числа или нет? - PullRequest
0 голосов
/ 15 апреля 2020

Том учит своего ученика находить факториал числа. Он хотел проверить понимание ученика. Для этого он предоставляет номер. Он хочет, чтобы студенты сказали ему, что число является факториалом того или иного числа.

Пример: если Том предоставит число как 120, студент должен ответить как 5, потому что 5! = 120.

Помогите студенту, написав для этого программу. Обратите внимание, что на входе должно быть число больше нуля. Если входное значение меньше или равно нулю, выходное значение должно быть «Неверный вход». Кроме того, если предоставленный ввод не является точно факториалом числа, скажем, предоставленный ввод - 122, который не является идеальным факториалом числа, он должен возвратить «Извините. Данное число не является идеальным факториалом ».

Пример ввода 1: 5040 Пример вывода 1: 7

Пример ввода 2: 0 Пример вывода 2: Неверный ввод

Пример Вход 3: 700 Пример вывода 3: Извините. Данное число не является идеальным факториалом

public static void main(string[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=n;
if (n<=0){
System.out.println("Invalid Input");
return;
}
for(int x=2;m!=x;x++)
{
m=m/x;
}
System.out.println(m);
}
else
System.out.println("the given number is not a perfect factorial")
}

, при выполнении этой программы оно не показывает ожидаемый результат для нефакторных чисел. Как и в примере с выводом 3, я не смог его получить.

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Я не уверен, что ваш код даже проходит компиляцию (похоже, есть еще условие без соответствующего if в конце).

Я сосредоточусь на ошибке в вашей логике c :

Вы выполняете int деление, деление входного числа на 2, 3, ..., n, пока результат всех этих делений не станет n, и в этот момент вы можете прийти к выводу, что оригинал input имеет факториал n.

  • Прежде всего, у вас нет логики c, которая бы вырвалась из l oop, если вход не факториален. Вы должны закончить sh l oop, если m <= x, а затем сказать, что вход является факториальным, только если m == x. </p>

  • секунда, в связи с до деления int, вы можете достичь ложного срабатывания. Например, если вы начнете с 7 и разделите его на 2, вы получите 3. Затем вы обнаружите, что 3 является следующим индексом l oop, поэтому вы выбываете из l oop и делаете неправильный вывод это 7 факториал. Вы должны выполнить деление, только если m % x == 0. В противном случае вы знаете, что ввод не является факториалом, и вы можете выйти из l oop.

0 голосов
/ 15 апреля 2020

В вашем коде много ошибок компиляции.

Мне кажется, что простой и интуитивно понятный подход заключается в том, чтобы вычислять факториал, начиная с 1, пока значение факториала не превысит ввод. В то время как вы вычисляете факториал. Если факториал значение равно числу, которое вы проверяете, вы нашли его. иначе это не идеальный факториал.

public static void main( String[] args )
{
    Scanner sc = new Scanner( System.in );
    int n = sc.nextInt();
    if ( n <= 0 ) {
        System.out.println( "Invalid Input" );
        return;
    }
    int fact = 1;
    boolean found = false;
    int i = 2;
    for ( ; fact < n; i++ ) {
        fact *= i;
        if ( fact == n ) {
            System.out.println( i );
            found = true;
            break;
        }
    }
    if ( n == 1 ) {
        System.out.println( 1 );//handle edge case
        found = true;
    }
    if ( !found ) {
        System.out.println( "the given number is not a perfect factorial" );
    }
}

РЕДАКТИРОВАТЬ: Нам нужно обрабатывать край случай 1 отдельно. И он не обрабатывает целочисленное переполнение.

...