Найти суму чисел которые входят в диапазон между двумя числами

Как найти суму чисел которые входят в диапазон между двумя числами? Суть задания: пользователь вводит два числа, затем программа находит между этими двумя числами, только те числа, которые имеют разные цифры. Нужно вывести сумму этих чисел которые входят у промежуток(вывод промежутка с числами есть у коде).

Фрагмент кода в который нужно это добавить:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, m, k = 0, p = 0, flag, i = 0, j, dig[10];
    do
    {
        printf("Enter m and n (m < n):\n");
        scanf("%d %d", &m, &n);
        if (m < n)
        {
            break;
        }
        else
            printf("\Error- m > n! Try again.\n\n");
    } while (k == 0);

    //printf("The sum of numbers in the interval [%d, %d] are:\n" );
    printf("Numbers in the interval [%d, %d] are:\n", m++, n--);
    for (k = m; k <= n; k++)
    {
        p = k;
        flag = 0;
        dig[i] = 0;
        i = 0;
        if (p < 10)
        { 
            continue;
        }   
        while (p > 0)
        { 
            dig[i] = p % 10;
            p = p / 10;
            i++;
        }
        dig[i] = -1;
        for (i = 0; dig[i] > -1; i++)
        { 
            for (j = i + 1; dig[j] > -1; j++)
            { 
                if (dig[i] == dig[j])
                { 
                    flag = 1;
                }
            }
        }

        if (flag == 0)
        {
            printf("%d\t", k);
        }
    }

    return 0;
}

Ответы (2 шт):

Автор решения: Mikhailo
#include <iostream>

using namespace std;

bool dif(int k) {
    int dig[10] = {0};

    while (k) {
        dig[k % 10]++;
        k /= 10;
        }

    for (int i = 0; i < 10; ++i)
        if (dig[i] > 1) return false;

    return true;
    }

int main() {
    int m, n, sum = 0;
    cin >> m >> n;

    for (int k = m; k <= n; k++) {
        if (dif(k)) sum += k;
        }

    cout << sum;
    }
→ Ссылка
Автор решения: Stanislav Volodarskiy

Это интересная комбинаторная задача, я хочу её решить, пусть и четыре год спустя.

Найдём сумму чисел у которых фиксировано количество цифр и некоторый префикс. Например PPPPPXXXXX, где символ P обозначает цифры префикса, символ X – цифры суффикса. Пусть k – длина суффикса, n количество цифр для помещения в суффикс. Количество чисел такого формата равно числу размещений из n по k: Ank.

Суммировать их будем по разрядам. Сумма всех префиксов PPPPP·10k·Ank.

Фиксируем значение и позицию одной цифры: PPPPPXXXDX, где D фиксированная цифра на позиции m (0 ≤ m < k). Таких чисел An-1k-1, вклад одной цифры в одном числе D·10m. Общая сумма D·10m·An-1k-1. Сумма по всем позициям m: D·((10k - 1)/9)·An-1k-1. Множитель в середине – репьюнит из k единиц.

До сих под учтён вклад только одной конкретной цифры. Вклад всех цифр суммируется:
((10k - 1)/9)·An-1k-1·∑{D}, где ∑{D} – сумма всех цифр, которые могут попасть в суффикс.

Общая сумма с префиксом и суффиксами:
PPPPP·10k·Ank + ((10k - 1)/9)·An-1k-1·∑{D}

Все элементы этой формулы однозначно определяются префиксом PPPPP и длиной суффикса k:

  • множество цифр суффикса ({D}) определяется цифрами префикса;
  • n – число возможных цифр в суффиксе, то есть |{D}|.

Обозначим сумму всех чисел с префиксом PPPPP и суффиксом из k цифр как s(PPPPP, k).

Тогда сумма всех чисел меньших 10m есть t(m) = t(m - 1) + ∑1≤d≤9 s(d, m - 1).

Первое слагаемое отвечает за числа [0, 10m-1). Второе слагаемое складывает числа в диапазонах [d·10m-1, (d + 1)·10m-1), где d пробегает все цифры, кроме нуля.

TODO: завершить теорию, добавить код.

→ Ссылка