Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2012, 22:29   #1
Ozzzzi
Новичок
Джуниор
 
Регистрация: 26.12.2011
Сообщений: 2
По умолчанию Сколько существует прыгающих чисел, меньше 10^65?

Здравствуйте!
Подскажите пожалуйста, в чем может быть проблема. Не выводит конесный результат.

Код:
/*Если в числе все цифры не меньше стоящих слева от них, оно называется увеличивающимся. Пример - 133456.
 Соответственно, если числа не меньше стоящих справа, оно называется убывающим. Пример: 66420. 
 Числа, которые не являются ни возрастающими, ни убывающими мы будет называть прыгающим. 
 Сколько существует прыгающих чисел, меньше 10^65?*/
using System;
using System.Numerics;


namespace Задача_прыгающие_числа_
{
    class Program
    {
        static void Main(string[] args)
        {
            BigInteger c;
            BigInteger max = BigInteger.Pow(10, 65);
            Console.WriteLine("Min = 1");
            Console.WriteLine("Max = " + max);
            BigInteger summ = 0;
            for (c = 0; c < max; c++)
            {
               if (IsJumpNum.IsJmpNm(c)) summ++;
               // Console.WriteLine("SUMM = " + summ);
            }
            var result = summ.ToString();
            Console.WriteLine("SUMM = " + result);
            Console.ReadLine();
        }
    }
}

class IsJumpNum
{
    static public bool IsJmpNm(BigInteger i)
    {
        int inc = 0; int dec = 0;
        var n = i.ToString().ToCharArray();
        //Console.WriteLine("Length = " + n.Length);
        for (int k = 0; k < n.Length - 1; k++)
        {
            if (n[k] >= n[k + 1]) inc++;
            if (n[k] <= n[k + 1]) dec++;
        }
        if (inc != 0 && dec != 0)
            return true;
        else
            return false;
    }
}
Ozzzzi вне форума Ответить с цитированием
Старый 29.09.2012, 22:42   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

думаю, солнце погаснет быстрее, чем данный цикл завершится

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

хинт 2: нужно идти другим путём

хинт 3: я бы посчитал, а сколько может быть убывающих и возрастающих чисел в этом диапазоне (только не в цикле, бога ради!). все остальные будут "прыгающими".
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 29.09.2012 в 23:01.
veniside вне форума Ответить с цитированием
Старый 29.09.2012, 23:02   #3
Ozzzzi
Новичок
Джуниор
 
Регистрация: 26.12.2011
Сообщений: 2
По умолчанию

не знаете другого пути?)
Ozzzzi вне форума Ответить с цитированием
Старый 30.09.2012, 17:38   #4
bondik
Форумчанин
 
Регистрация: 24.04.2008
Сообщений: 300
По умолчанию

Если решать в лоб то я попробовал бы на Cuda. GPU иногда дает фантастические результаты...
bondik вне форума Ответить с цитированием
Старый 01.10.2012, 16:33   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
не знаете другого пути?)
хинт 4: убывающие и возрастающие числа зеркально симметричны, так что достаточно посчитать количество только одних, других будет ровно столько же.


подсчитать количество различных невозрастающих (или неубывающих) последовательностей, длиной от 1 до 65 и состоящих из цифр от 0 до 9 можно разными способами.

можно запустить 65 циклов, типа:

Код:
int sum = 0;

for (int i00 = 0; i00 <= 9; i00++)
  for (int i01 = i00; i01 <= 9; i01++)
    for (int i02 = i01; i02 <= 9; i02++)

//... и так далее до:

            for (int i64 = i63; i64 <= 9; i64++)
              sum++;
но, во-первых, это не красиво, а, во-вторых, работает долговато. Солнце не погаснет, конечно, но подождать часик или два прийдётся.

лично я решил через рекурсивную матрицу:

Код:

// код на js, если шо
// всего 650 ведёр, и золотой ключик у нас в кармане

const   digits = 10;
const   rounds = 65;

var a = new Array(digits);

for (var i = digits - 1; i >= 0; i--) {
    //
    a[i] = new Array(rounds);
    //
    for (var j = 0; j < rounds; j++)
    {
        if (digits - 1 == i)
            a[i][j] = 1;
        else    
        {
            if (0 == j)
                a[i][j] = a[i + 1][0] + 1;
            else
                a[i][j] = a[i + 1][j] + a[i][j - 1];
        }
    }
}    
    
console.log(a[0][rounds - 1]);

Не берусь на 100% утверждать, что я нигде не ошибся, но если принять это решение за верное, получаем количество "прыгающих" числел = 10^65 - 110524147514 * 2.



Цитата:
решать в лоб то я попробовал бы на Cuda
ну давайте попробуем. Допустим, у нас есть супер-мега жпу, который работает на частоте 1 петагерц (10^15 герц) в составе которого есть ну, допустим, 1 миллиард (10^9) процессоров. Предположим, мы написали чудо-программу, которая за 1 такт одного такого процессора обрабатывает 1 комбинацию. Итого, за 1 секунду наш программно-аппаратный чудо-комплекс будет способен обработать ни много, ни мало, а целых 10^24 комбинаций. Отлично! Так, минутку.. всего комбинаций у нас 10^65, т.е. потребуется всего-навсего 10^41 секунд, чтобы получить желанный результат. Для сравнения, возраст солнечной системы равен примерно 1.5*10^17 секунд.

Цитата:
GPU иногда дает фантастические результаты
это не тот случай )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 01.10.2012, 16:44   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

А, что значит "прыгающих"? Может ещё и бьющих по-лбу?
Пятьдесят лет живу. Тридцать из них изучаю математику, чёт про такое не слышал. Просветите .
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 01.10.2012, 16:46   #7
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

в комментариях кода в первом же посте написано
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 01.10.2012, 16:46   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

это кривой термин из первого сообщения:

Цитата:
/*Если в числе все цифры не меньше стоящих слева от них, оно называется увеличивающимся. Пример - 133456.
Соответственно, если числа не меньше стоящих справа, оно называется убывающим. Пример: 66420.
Числа, которые не являются ни возрастающими, ни убывающими мы будет называть прыгающим.
Сколько существует прыгающих чисел, меньше 10^65?*/
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 01.10.2012, 17:03   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Почитал коммнтарии. Башку сломал. Кто-нибудь может мне внятно сказать чего ТС хочет? Или мне жаргон 80-х применить? Думаю, мало не покажется.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 01.10.2012, 17:09   #10
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

если цифры в числе не убывают, то оно "увеличивающееся", например: 11112223445666789
если цифры в числе не возрастают, то оно "убывающее", например: 9988776665333211
если ни то, ни то, то оно "прыгающее", например: 1236321

вопрос: сколько существует разных "прыгающих" числел, в диапазоне от 0 до 10^65
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кто знает точно сколько существует языков программирования? Programmer №1 Свободное общение 20 21.07.2012 10:47
Перевод чисел из десятичной системы в систему с основанием меньше 10 [Паскаль] Pirokara Помощь студентам 0 03.12.2010 17:25
Ввести несколько чисел (кол-во чисел запрашивать с экрана). Определить, сколько чисел, меньших заданного Lirika Помощь студентам 0 08.05.2010 21:39
Из чисел 1, 1+ 1/2, 1+1/2+1/3 , … вывести на экран те, которые меньше а. umiko Microsoft Office Excel 1 16.05.2009 08:29
Найти сумму положительных нечетных чисел меньше 50 мандаринка Паскаль, Turbo Pascal, PascalABC.NET 8 22.12.2007 21:45