Как найти произведение цифр целого числа n

Сумма и произведение цифр числа

Просмотров 11.9к. Обновлено 29 октября 2021

  1. Присвоить переменной, в которой будет накапливаться сумма цифр, значение 0, а переменной для накопления произведения — значение 1 (если присвоить 0, то при умножении результат обнулится).
  2. Пока введенное число не уменьшится до нуля выполнять следующие действия:
    1. В переменную для суммы цифр добавлять последнюю цифру числа, извлеченную при нахождении остатка от деления на 10.
    2. Значение переменной для хранения произведения цифр умножить на последнюю цифру числа.
    3. Избавиться от последней цифры числа, разделив его нацело на 10.

Pascal

Сумма цифр числа паскаль


var
n, sum: word;
mult: longint;
begin
readln(n);
sum := 0;
mult := 1;
while n > 0 do begin
sum := sum + n mod 10;
mult := mult * (n mod 10);
n := n div 10;
end;
writeln('Sum: ', sum);
writeln('Mult: ', mult);
end.



462
Sum: 12
Mult: 48

Язык Си


#include

main() {
int n, s, m;
scanf("%d",&n);
s = 0;
m = 1;
while (n>0) {
s += n%10;
m *= n%10;
n = n/10;
}
printf("Сумма: %dnПроизведение: %dn", s, m);
}



245
Сумма: 11
Произведение: 40

Python

Сумма цифр числа python (питон)


n = int(input())
s = 0
m = 1
while n>0:
s += n%10
m *= n%10
n = n//10
print("Сумма:", s)
print("Произведение:", m)



567
Сумма: 18
Произведение: 210

КуМир


алг сумма цифр
нач
цел n, s, m
ввод n
s := 0
m := 1
нц пока n>0
s := s + mod(n,10)
m := m * mod(n,10)
n := div(n,10)
кц
вывод s, нс, m
кон



2932
16
108

Basic-256


input n
sum = 0
mult = 1
while n > 0
sum = sum + n%10
mult = mult * (n%10)
n = n10
endwhile
print "Сумма: " + sum
print "Произведение: " + mult



567
Сумма: 18
Произведение: 210

Сумма и произведение цифр числа

Одной из часто используемых задач для начинающих изучать программирование является нахождение суммы и произведения цифр числа. Число может вводиться с клавиатуры или генерироваться случайно. Задача формулируется так:

Дано число. Найти сумму и произведение его цифр.

Например, сумма цифр числа 253 равна 10-ти, так как 2 + 5 + 3 = 10. Произведение цифр числа 253 равно 30-ти, так как 2 * 5 * 3 = 30.

В данном случае задача осложняется тем, что количество разрядов числа заранее (на момент написания программы) не известно. Это может быть и трехзначное число, как в примере выше, и восьмизначное, и однозначное.

Обычно предполагается, что данная задача должна быть решена арифметическим способом и с использованием цикла. То есть с заданным число должны последовательно выполняться определенные арифметические действия, позволяющие извлечь из него все цифры, затем сложить их и перемножить.

При этом используются операции деления нацело и нахождения остатка. Если число разделить нацело на 10, произойдет “потеря” последней цифры числа. Например, 253 ÷ 10 = 25 (остаток 3). С другой стороны, эта потерянная цифра есть остаток от деления. Получив эту цифру, мы можем добавить ее к сумме цифр и умножить на нее произведение цифр числа.

Пусть n – само число, suma – сумма его цифр, а mult – произведение. Тогда алгоритм нахождения суммы и произведения цифр можно словесно описать так:

  1. Переменной suma присвоить ноль.
  2. Переменной mult присвоить единицу. Присваивать 0 нельзя, так как при умножении на ноль результат будет нулевым.
  3. Пока значение переменной n больше нуля повторять следующие действия:
    1. Найти остаток от деления значения n на 10, то есть извлечь последнюю цифру числа.
    2. Добавить извлеченную цифру к сумме и увеличить на эту цифру произведение.
    3. Избавиться от последнего разряда числа n путем деления нацело на 10.

В языке Python операция нахождения остатка от деления обозначается знаком процента – %. Деление нацело – двумя слэшами – //.

Код программы на языке Python

n = int(input())
 
suma = 0
mult = 1
 
while n > 0:
    digit = n % 10
    suma = suma + digit
    mult = mult * digit
    n = n // 10
 
print("Сумма:", suma)
print("Произведение:", mult)

Пример выполнения:

253
Сумма: 10
Произведение: 30

Изменение значений переменных можно записать в сокращенном виде:

...
while n > 0:
    digit = n % 10
    suma += digit
    mult *= digit
    n //= 10
...

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

Если число отрицательное, это не влияет на сумму его цифр. В таком случае достаточно будет использовать встроенную в Python функции abc, которая возвращает абсолютное значение переданного ей аргумента. Она превратит отрицательное число в положительное, и цикл while с его условием n > 0 будет работать как и прежде.

Если число равно нулю, то по логике вещей сумма его цифр и их произведение должны иметь нулевые значения. Цикл срабатывать не будет. Поскольку исходное значение mult – это 1, следует добавить проверку на случай, если заданное число – это ноль.

Программа, обрабатывающая все целые числа, может начинаться так:

n = abs(int(input()))
 
suma = 0
mult = 1
if n == 0:
    mult = 0
...

Заметим, если в самом числе встречается цифра 0 (например, 503), то произведение всех цифр будет равно нулю. Усложним задачу:

Вводится натуральное число. Найти сумму и произведение цифр, из которых состоит это число. При этом если в числе встречается цифра 0, то ее не надо учитывать при нахождении произведения.

Для решения такой задачи в цикл добавляется проверка извлеченной цифры на ее неравенство нулю. Делать это надо до умножения на нее значения переменной-произведения.

n = int(input())
 
suma = 0
mult = 1
 
while n > 0:
    digit = n % 10
    if digit != 0:  
        suma += digit
        mult *= digit
    n = n // 10
 
print("Сумма:", suma)
print("Произведение:", mult)

Обратим внимание, что заголовок условного оператора if digit != 0: в Python можно сократить до просто if digit:. Потому что 0 – это False. Все остальные числа считаются истиной.

Приведенный выше математический алгоритм нахождения суммы и произведения цифр числа можно назвать классическим, или универсальным. Подобным способом задачу можно решить на всех императивных языках, независимо от богатства их инструментария. Однако средства языка программирования могут позволить решить задачу другим, зачастую более простым, путем. Например, в Python можно не преобразовывать введенную строку к числу, а извлекать из нее отдельные символы, которые преобразовывать к целочисленному типу int:

a = input()
 
suma = 0
mult = 1
 
for digit in a:
    suma += int(digit)
    mult *= int(digit)
 
print("Сумма:", suma)
print("Произведение:", mult)

Если добавить в код проверку, что извлеченный символ строки действительно является цифрой, то программа станет более универсальной. С ее помощью можно будет считать не только сумму и произведение цифр целых чисел, но и вещественных, а также цифр, извлекаемых из произвольной строки.

n = input()
 
suma = 0
mult = 1
 
for digit in n:
    if digit.isdigit():
        suma += int(digit)
        mult *= int(digit)
 
print("Сумма:", suma)
print("Произведение:", mult)

Пример выполнения:

это3 чи3с9ло!
Сумма: 15
Произведение: 81

Строковый метод isdigit проверяет, состоит ли строка только из цифр. В нашем случае роль строки играет одиночный, извлеченный на текущей итерации цикла, символ.

Глубокое знание языка Python позволяет решить задачу более экзотическими способами:

import functools
 
n = input()
n = [int(digit) for digit in n]
 
suma = sum(n)
mult = functools.reduce(lambda x, y: x*y, n)
 
print("Сумма:", suma)
print("Произведение:", mult)

Выражение [int(digit) for digit in n] представляет собой генератор списка. Если была введена строка "234", будет получен список чисел: [2, 3, 4].

Встроенная функция sum считает сумму элементов переданного ей аргумента.

Функция reduce модуля functools принимает два аргумента – лямбда-выражение и в данном случае список. Здесь в переменной x происходит накопление произведения, а y принимает каждое следующее значение списка.

Больше задач в PDF

Задача взята с acmp.ru (Время: 1 сек. Память: 16 Мб Сложность: 42%)

Задача на внимательность.

Требуется найти наименьшее натуральное число Q такое, что произведение его цифр равно заданному числу N.

Входные данные:
В единственной строке входного файла INPUT.TXT записано одно целое число N (0 ≤ N ≤ 10^9).

Выходные данные:
В выходной файл OUTPUT.TXT нужно вывести искомое число Q. В том случае, если такого числа не существует, следует вывести -1.

Пример 1:
INPUT.TXT: 10
OUTPUT.TXT : 25

Пример 2:
INPUT.TXT: 13
OUTPUT.TXT : -1

Пример 3:
INPUT.TXT: 90
OUTPUT.TXT : 259

Итак, от нас требуют найти минимальное число, произведение цифр которого равно заданному значению. Первая мысль, которая может возникнуть — перебирать числа в порядке возрастания, делить их на цифры и перемножать. Однако, с учетом допустимых диапазонов входных данных — работать это будет слишком долго.

На самом деле, в задаче есть смысл стараться подобрать делители числа N. Можно заметить, что если число делится на 8 — то его делителями будут также 2 и 4, однако, 2 разряда дадут однозначно большее число, чем один (8 < 24). Поэтому по возможности надо выбирать как можно большие цифры. Тогда логика решения заключается в том, чтобы делить число на 9 пока делится нацело и считать число девяток, потом на 8 и т.д. Если в результате такой операции получается единица – вывод осуществляется в обратном порядке (от двойки к девятке выводится количество цифр). Если же единицу получить не удалось – выводим -1 (искомого Q не существует).

Дальше остается только учесть все детали. Первое — допустимым значением является ноль, но для такого значения наш алгоритм зациклится — его необходимо обработать отдельно. Кроме того, минимальным натуральным числом, таким, что произведение его цифр равно нулю является 10 (вычислить такое значение никак не получилось бы без перебора).

Другая проблема — если исходное число равно единице. По описанному выше алгоритму мы продолжаем делить число на цифры пока не получим единицу, но если мы получили ее сразу — то у нас нет ни одной цифры и в файл мы ничего не выведем. Поэтому такой случай также стоит обработать отдельно. Итак, финальный исходный код программы мог бы выглядеть следующим образом:

#include <fstream>
#include <algorithm>
using namespace std;

int main() {
  ifstream ifst("input.txt");
  ofstream ofst("output.txt");
  
  long long n;
  unsigned long long digits[10];
  ifst >> n;
  
  if (0 == n) {
    ofst << 10;
    return 0;
  }
  
  if (1 == n) {
    ofst << 1;
    return 0;
  }

  for (int i = 9; i > 1; --i) {
    digits[i] = 0;
    while (n%i == 0) {
      n/=i;
      digits[i]++;
    }
  }

  if (n == 1) {
    for (int i = 2; i <= 9; ++i) {
      while (digits[i]) {
        digits[i]--;
        ofst << i;
      }
    }
  }
  else {
    ofst << -1;
  }
}

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    Given a number, the task is to find the product of the digits of a number.

    Examples: 

    Input: n = 4513
    Output: 60
    
    Input: n = 5249
    Output: 360

    General Algorithm for product of digits in a given number:  

    1. Get the number
    2. Declare a variable to store the product and set it to 1
    3. Repeat the next two steps till the number is not 0
    4. Get the rightmost digit of the number with help of remainder ‘%’ operator by dividing it with 10 and multiply it with product.
    5. Divide the number by 10 with help of ‘/’ operator
    6. Print or return the product.

    Below is the solution to get the product of the digits: 

    C++

    #include<bits/stdc++.h>

    using namespace std;

    int getProduct(int n)

    {

        int product = 1;

        while (n != 0) 

        {

            product = product * (n % 10);

            n = n / 10;

        }

        return product;

    }

    int main()

    {

        int n = 4513;

        cout << (getProduct(n));

    }

    Java

    import java.io.*;

    class GFG {

        static int getProduct(int n)

        {

            int product = 1;

            while (n != 0) {

                product = product * (n % 10);

                n = n / 10;

            }

            return product;

        }

        public static void main(String[] args)

        {

            int n = 4513;

            System.out.println(getProduct(n));

        }

    }

    Python3

    def getProduct(n):

        product = 1

        while (n != 0):

            product = product * (n % 10)

            n = n // 10

        return product

    n = 4513

    print(getProduct(n))

    C#

    using System;

    class GFG 

        static int getProduct(int n) 

        

            int product = 1; 

            while (n != 0) 

            

                product = product * (n % 10); 

                n = n / 10; 

            

            return product; 

        

        public static void Main() 

        

            int n = 4513; 

            Console.WriteLine(getProduct(n)); 

        

    }

    PHP

    <?php

    <?php

    function getProduct($n)

    {

        $product = 1;

        while ($n != 0) 

        {

            $product = $product * ( $n % 10);

            $n = intdiv($n , 10);

        }

        return $product;

    }

    $n = 4513;

    echo getProduct($n);

    ?>

    Javascript

    <script>

    function getProduct(n)

    {

        let product = 1;

        while (n != 0)

        {

            product = product * (n % 10);

            n = Math.floor(n / 10);

        }

        return product;

    }

    let n = 4513;

    document.write(getProduct(n));

    </script>

    Time Complexity: O(log10N)
    Auxiliary Space: O(1)

    Method #2:Using string() method:

    • Convert the integer to string
    • Traverse the string and multiply the characters by converting them to integer

    When this method can be used?: When the number of digits of a number exceeds 10^{19}                    , we can’t take that number as an integer since the range of long long int doesn’t satisfy the given number. So take input as a string, run a loop from start to the length of the string and increase the sum with that character(in this case it is numeric)

    Below is the implementation:

    C++

    #include <iostream>

    using namespace std;

    int getProduct(string str)

    {

        int product = 1;

        for (int i = 0; i < str.length(); i++) {

            product = product * (str[i] - 48);

        }

        return product;

    }

    int main()

    {

        string st = "4513";

        cout << getProduct(st);

        return 0;

    }

    Java

    import java.io.*;

    class GFG {

    static int getProduct(String str)

    {

        int product = 1;

        for (int i = 0; i < str.length(); i++)

        {

            product *= str.charAt(i) - '0';

        }

        return product;

    }

    public static void main(String[] args)

    {

        String st = "4513";

        System.out.println(getProduct(st));

    }

    }

    Python3

    def getProduct(n):

        product = 1

        num = str(n)

        for i in num:

            product = product * int(i)

        return product

    n = 4513

    print(getProduct(n))

    C#

    using System;

    using System.Collections;

    class GFG 

    {

    static int getProduct(String str)

    {

        int product = 1;

        for (int i = 0; i < str.Length; i++)

        {

            product = product * (str[i] - 48);

        }

        return product;

    }

    public static void Main(String[] args)

    {

        String st = "4513";

        Console.Write(getProduct(st));

    }

    }

    Javascript

    <script>

    function getProduct(str)

    {

        let product = 1;

        for (let i = 0; i < str.length; i++)

        {

            product = product * (parseInt(str[i]));

        }

        return product;

    }

    let st = "4513";

    document.write(getProduct(st));

    </script>

    Time Complexity: O(N)
    Auxiliary Space: O(1)

    Method #3: Recursion

    1. Get the number
    2.  Get the remainder and pass the next remaining digits
    3. Get the rightmost digit of the number with help of the remainder ‘%’ operator by dividing it by 10 and multiply it to the product.
    4.   Divide the number by 10 with help of ‘/’ operator to remove the rightmost digit
    5.  Check the base case with n = 0
    6. Print or return the product

    C++

    #include <iostream>

    using namespace std;

    int getProduct(int n){

        if(n == 0){

            return 1 ;

        }

        return (n%10) * getProduct(n/10) ;

    }

    int main() {

        cout<<getProduct(125) ;

        return 0;

    }

    Java

    import java.util.*;

    class GFG

    {

      static int getProduct(int n)

      {

        if(n == 0){

          return 1 ;

        }

        return (n%10) * getProduct(n/10) ;

      }

      public static void main(String[] args)

      {

        System.out.println(getProduct(125));

      }

    }

    Python3

    def getProduct(n):

        if(n == 0):

            return 1 

        return (n%10) * getProduct(n//10) ;

    print(getProduct(125));

    C#

    using System;

    using System.Collections.Generic;

    class GFG

    {

      static int getProduct(int n)

      {

        if(n == 0){

          return 1 ;

        }

        return (n%10) * getProduct(n/10) ;

      }

      public static void Main(string[] args)

      {

        Console.WriteLine(getProduct(125));

      }

    }

    Javascript

    function getProduct(n){

        if(n == 0){

            return 1 ;

        }

        return (n%10) * getProduct(Math.floor(n/10)) ;

    }

    console.log(getProduct(125));

    Time Complexity: O(log10N)
    Auxiliary Space: O(1)

    Last Updated :
    13 Mar, 2023

    Like Article

    Save Article

    3 / 3 / 1

    Регистрация: 29.01.2010

    Сообщений: 113

    1

    Найти произведение цифр числа

    18.04.2010, 15:22. Показов 6830. Ответов 6


    Студворк — интернет-сервис помощи студентам

    Помогите решить задания!!!!!!!!!!!!!!! Буду очень благодарен…..

    Миниатюры

    Найти произведение цифр числа
     



    0



    yanyk1n

    4341 / 1473 / 680

    Регистрация: 12.03.2009

    Сообщений: 5,310

    18.04.2010, 15:33

    2

    2)

    Pascal
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    uses crt;
    var N,p:integer;
     
    begin
     clrscr;
     write('N-> ');
     readln(N);
     p := 1;
     while N<>0 do
     begin
      p := p * N mod 10;
      N := N div 10;
     end;
     writeln('P=',p);
     readln;
    end.



    1



    STGE

    773 / 578 / 324

    Регистрация: 17.06.2009

    Сообщений: 1,188

    18.04.2010, 15:35

    3

    2.

    Pascal
    1
    
    a:=(a mod 10) * (a div 1000) * (a div 100 mod 10) * (a mod 100 div 10);



    1



    yanyk1n

    4341 / 1473 / 680

    Регистрация: 12.03.2009

    Сообщений: 5,310

    18.04.2010, 15:36

    4

    3)

    Pascal
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    uses crt;
    var n,i,k,a:integer;
     
    begin
     clrscr;
     write('N -> ');
     readln(N);
     k := 0;
     for i:=1 to N do
     begin
      write(i,'-е число -> ');
      readln(a);
      if a<0 then inc(k);
     end;
     writeln('Отрицательных - ',k);
     readln;
    end.

    Добавлено через 1 минуту
    4)

    Pascal
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    uses crt;
    var x,y:real;
     
    begin
     clrscr;
     write('X -> ');
     readln(X);
     y := sqr(sqr(sqr(x))) + 2 * sqr(sqr(x)) + 3 * sqr(x) + 4;
     writeln('Y=',y:0:4);
     readln;
    end.



    1



    STGE

    773 / 578 / 324

    Регистрация: 17.06.2009

    Сообщений: 1,188

    18.04.2010, 15:37

    5

    4.

    Pascal
    1
    
    y:=sqr(sqr(sqr(x)))+2*sqr(sqr(x))+3*sqr(x)+4;



    1



    yanyk1n

    4341 / 1473 / 680

    Регистрация: 12.03.2009

    Сообщений: 5,310

    18.04.2010, 15:43

    6

    6)

    Pascal
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    uses crt;
    var n,i:integer;
    t:text;
    a:real;
     
    begin
     clrscr;
     assign(t,'input.txt');
     rewrite(t);
     for i:=1 to 10 do
     begin
      write(i,'-е число -> ');
      readln(a);
      write(f,a,' ');
     end;
     close(t);
     reset(t);
     for i:=1 to 10 do
     begin
      read(t,a);
      if (abs(a)>=4) and (abs(a)<=5) then writeln(a:0:4);
     end;
     close(t);
     readln;
    end.



    1



    3 / 3 / 1

    Регистрация: 29.01.2010

    Сообщений: 113

    18.04.2010, 18:16

     [ТС]

    7

    Цитата
    Сообщение от XNick
    Посмотреть сообщение

    Помогите решить задания!!!!!!!!!!!!!!! Буду очень благодарен…..

    А вот еще необходимо составить блок-схемы к заданиям….



    0



    Добавить комментарий