Как найти сумму составных чисел

Given a range [L, R], the task is to find all the numbers from the range which are composite as well as the eventual sum of their digits is 1.
Examples: 
 

Input: L = 10, R = 100 
Output: 10 28 46 55 64 82 91 100 
10 = 1 + 0 = 1 
28 = 2 + 8 = 10 = 1 + 0 = 1 
… 
91 = 9 + 1 = 10 = 1 + 0 = 1 
100 = 1 + 0 + 0 = 1
Input: L = 250, R = 350 
Output: 253 262 280 289 298 316 325 334 343 
 

Approach: For every number in the range check if the number is composite i.e. it has a divisor other than 1 and the number itself. If the current number is a composite number then keep on calculating the sum of its digits until the number is reduced to a single digit, if this digit is 1 then the chosen number is a valid number.
Below is the implementation of the above approach:
 

C++

#include <iostream>

using namespace std;

bool isComposite(int n)

{

    if (n <= 1)

        return false;

    if (n <= 3)

        return false;

    if (n % 2 == 0 || n % 3 == 0)

        return true;

    for (int i = 5; i * i <= n; i = i + 6)

        if (n % i == 0 || n % (i + 2) == 0)

            return true;

    return false;

}

bool isDigitSumOne(int nm)

{

    while (nm > 9) {

        int sum_digit = 0;

        while (nm > 0) {

            int digit = nm % 10;

            sum_digit = sum_digit + digit;

            nm = nm / 10;

        }

        nm = sum_digit;

    }

    if (nm == 1)

        return true;

    else

        return false;

}

void printValidNums(int l, int r)

{

    for (int i = l; i <= r; i++) {

        if (isComposite(i) && isDigitSumOne(i))

            cout << i << " ";

    }

}

int main(void)

{

    int l = 10, r = 100;

    printValidNums(l, r);

    return 0;

}

Java

public class GFG {

    static boolean isComposite(int n)

    {

        if (n <= 1)

            return false;

        if (n <= 3)

            return false;

        if (n % 2 == 0 || n % 3 == 0)

            return true;

        for (int i = 5; i * i <= n; i = i + 6)

            if (n % i == 0 || n % (i + 2) == 0)

                return true;

        return false;

    }

    static boolean isDigitSumOne(int nm)

    {

        while (nm > 9) {

            int sum_digit = 0;

            while (nm > 0) {

                int digit = nm % 10;

                sum_digit = sum_digit + digit;

                nm = nm / 10;

            }

            nm = sum_digit;

        }

        if (nm == 1)

            return true;

        else

            return false;

    }

    static void printValidNums(int l, int r)

    {

        for (int i = l; i <= r; i++) {

            if (isComposite(i) && isDigitSumOne(i))

                System.out.print(i + " ");

        }

    }

    public static void main(String arg[])

    {

        int l = 10, r = 100;

        printValidNums(l, r);

    }

}

Python3

def isComposite(n):

    if (n <= 1):

        return False

    if (n <= 3):

        return False

    if (n % 2 == 0 or n % 3 == 0):

        return True

    i = 5

    while(i * i <= n):

        if (n % i == 0 or n % (i + 2) == 0):

            return True

        i = i + 6

    return False

def isDigitSumOne(nm) :

    while(nm>9) :

        sum_digit = 0

        while(nm != 0) :

            digit = nm % 10

            sum_digit = sum_digit + digit

            nm = nm // 10

        nm = sum_digit

    if(nm == 1):

        return True

    else:

        return False

def printValidNums(m, n ):

    for i in range(m, n + 1):

        if(isComposite(i) and isDigitSumOne(i)) :

            print(i, end =" ")

l = 10

r = 100

printValidNums(m, n)

C#

using System;

class GFG

{

    static bool isComposite(int n)

    {

        if (n <= 1)

            return false;

        if (n <= 3)

            return false;

        if (n % 2 == 0 || n % 3 == 0)

            return true;

        for (int i = 5; i * i <= n; i = i + 6)

            if (n % i == 0 || n % (i + 2) == 0)

                return true;

        return false;

    }

    static bool isDigitSumOne(int nm)

    {

        while (nm > 9)

        {

            int sum_digit = 0;

            while (nm > 0)

            {

                int digit = nm % 10;

                sum_digit = sum_digit + digit;

                nm = nm / 10;

            }

            nm = sum_digit;

        }

        if (nm == 1)

            return true;

        else

            return false;

    }

    static void printValidNums(int l, int r)

    {

        for (int i = l; i <= r; i++)

        {

            if (isComposite(i) && isDigitSumOne(i))

                Console.Write(i + " ");

        }

    }

    static public void Main ()

    {

        int l = 10, r = 100;

        printValidNums(l, r);

    }

}

PHP

<?php

function isComposite($n)

{

    if ($n <= 1)

        return false;

    if ($n <= 3)

        return false;

    if ($n % 2 == 0 || $n % 3 == 0)

        return true;

    for ($i = 5; $i * $i <= $n; $i = $i + 6)

        if ($n % $i == 0 || $n % ($i + 2) == 0)

            return true;

    return false;

}

function isDigitSumOne($nm)

{

    while ($nm > 9)

    {

        $sum_digit = 0;

        while ($nm > 0)

        {

            $digit = $nm % 10;

            $sum_digit = $sum_digit + $digit;

            $nm = floor($nm / 10);

        }

        $nm = $sum_digit;

    }

    if ($nm == 1)

        return true;

    else

        return false;

}

function printValidNums($l, $r)

{

    for ($i = $l; $i <= $r; $i++)

    {

        if (isComposite($i) && isDigitSumOne($i))

            echo $i, " ";

    }

}

$l = 10; $r = 100;

printValidNums($l, $r);

?>

Javascript

<script>

function isComposite(n)

{

    if (n <= 1)

        return false;

    if (n <= 3)

        return false;

    if (n % 2 == 0 || n % 3 == 0)

        return true;

    for (let i = 5; i * i <= n; i = i + 6)

        if (n % i == 0 || n % (i + 2) == 0)

            return true;

    return false;

}

function isDigitSumOne(nm)

{

    while (nm > 9) {

        let sum_digit = 0;

        while (nm > 0) {

            let digit = nm % 10;

            sum_digit = sum_digit + digit;

            nm = Math.floor(nm / 10);

        }

        nm = sum_digit;

    }

    if (nm == 1)

        return true;

    else

        return false;

}

function printValidNums(l, r)

{

    for (let i = l; i <= r; i++) {

        if (isComposite(i) && isDigitSumOne(i))

            document.write(i + " ");

    }

}

    let l = 10, r = 100;

    printValidNums(l, r);

</script>

Output:

10 28 46 55 64 82 91 100

Time Complexity: O((r – l) * (sqrt(r – l) + log10(r – l)))

Auxiliary Space: O(1)

Optimizations : We can precompute composite numbers using Sieve Algorithms.
 

program Project1;
 
uses crt;
 
var m, i, k, s: integer; //входное число, счётчик, счётчик количества чисел в выходной строке, сумма
 
//если число простое, эта функция возвращает true,
//если число составное, эта функция возвращает false
//специально не писалась, достал из своей коллекции
function simple(N: integer): boolean;
var i: integer;
begin
if n < 2
  then Result := False
  else begin
    Result := True;
    for i:=2 to trunc(sqrt(N)) do
    if N mod i = 0
      then begin
        Result := False;
        exit;
      end;
  end;
end;
//сама программа
begin
repeat
  write('Enter M > 1 : '); //ввод M
  readln(m);
until m > 1; //если M > 1, то идём дальше, иначе повторяем ввод
s := 0;
k := 1;
writeln('Not simple numbers:');
for i := 2 to m do 
  if (not simple(i)) then
    if (maxint - i) >= s then
      begin
        s := s + i; //считаем сумму
        write(i, ', ');
        if k mod 10 = 0 then writeln;
        k := k + 1
      end
    else begin //защита от integer overflow
      writeln;
      writeln('M is too large!');
      readln;
      exit;
    end;
writeln;
if s > 0 then writeln('Sum of not simple = ', s)
         else writeln('All numbers is simple!');
readln;
end.

  • Простые числа
  • Таблица простых чисел
  • Проверка числа на простоту
  • Простые числа, примеры и решения

Примеры решения задач

Рассмотрим решения нескольких задач на использование простых чисел. Задачи в основном на доказательство.

СУММА ПРОСТЫХ ЧИСЕЛ

Всегда ли сумма простых чисел – это составное число?

Рассмотрим примеры, чтобы выяснить верно утверждение или нет.

Пример

Возьмем два простых числа: 3 и 5.
Их сумма равна 3 + 5 = 8.
8 – составное число.

Еще пример

Теперь выберем числа 2 и 3.
При сложении 2 + 3 = 5 получили простое число 5.

Сумма простых чисел может быть как простым, так и составным числом

Если углубиться дальше, то можно показать, что сумма большинства простых чисел – это составное число. А если сумма двух простых чисел тоже простое, то одно из слагаемых – число 2. Например:
2 + 5 = 7 – простое число
2 + 11 = 13 – простое число
2 + 29 = 31 – тоже простое.

РАЗНОСТЬ ПРОСТЫХ ЧИСЕЛ

Всегда ли разность простых чисел – это составное число?

Снова приведем примеры

Пример

Возьмем два простых числа: 17 и 5.
Их разность равна 17 – 5 = 12.
12 – составное число.

Пример

Теперь выберем числа 13 и 2.
При вычитании 13 – 2 = 11 получили простое число 11.

Разность простых чисел может быть как простым, так и составным числом

Как и в случае с суммой , разность двух простых чисел – это число простое, если вычитается число 2. Например:
19 – 2 = 17 – простое число
43 – 2 = 41 – простое число
61 – 2 = 59 – тоже простое.

Полезные материалы по теме

  • Простые числа
  • Таблица простых чисел
  • Проверка, простое ли число

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