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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2011, 03:11   #111
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Вот ещё одно решение:
Код:

#include <iostream>
#include <cmath>
#include <cassert>

using namespace std;

int bestpow(int a)
{
    int i = 0;
    while(a - pow(10, i) >= 0) {
        i = i + 1;
    }
    return i - 1;
}

/// Количество чисел БЕЗ единички в промежутке [1; k]
int f(int k)
{
    if(bestpow(k) <= 0) {
        if(k == 0) {
            return 1;
        } else {
            return k;
        }
    }
    
    if(int(k / pow(10, bestpow(k))) >= 2) {
        return (int(k / pow(10, bestpow(k))) - 1) * pow(9, bestpow(k))
               + f(k - int(k / pow(10, bestpow(k))) * pow(10, bestpow(k)));
    }
    
    if(int(k / pow(10, bestpow(k))) == 1) {
        return pow(9, bestpow(k));
    }
}

int main()
{
    int x;
    do {
        cout << "Enter fucking positive number: ";
        cin >> x;
    } while(x < 1);
    
    int result = x - f(x) + 1;
    
    cout << "Your answer is " << result << ", dumbass." << endl;
}
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 03.02.2011, 03:13   #112
Акоб
Форумчанин
 
Регистрация: 10.01.2011
Сообщений: 243
По умолчанию

извени Obey-Kun у меня компилятор сдох. ни хрена не понимаю((
дай дебаг своей программы.
Акоб вне форума Ответить с цитированием
Старый 03.02.2011, 03:16   #113
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Вместо bestpow можно int(log10(K))+1 или типа того
это отсюда -- http://www.linux.org.ru/forum/talks/5864969/
всё, я спать, а то пива нажрался

Акоб, http://programmersforum.ru/showpost....&postcount=112
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 03.02.2011, 03:22   #114
Акоб
Форумчанин
 
Регистрация: 10.01.2011
Сообщений: 243
По умолчанию

Enter fucking positive number: 201
i = 2, tmp = 2, dikiy(tmp, i) = 119
i = 1, tmp = 0, dikiy(tmp, i) = 0
i = 0, tmp = 1, dikiy(tmp, i) = 1
Your answer is 120, dumbass.
Press any key to continue
Акоб вне форума Ответить с цитированием
Старый 03.02.2011, 03:23   #115
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Так это правильный результат...
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 03.02.2011, 03:52   #116
Акоб
Форумчанин
 
Регистрация: 10.01.2011
Сообщений: 243
По умолчанию

Enter fucking positive number: 1000
i = 3, tmp = 1, dikiy(tmp, i) = 271
Your answer is 271, dumbass.
Press any key to continue
Акоб вне форума Ответить с цитированием
Старый 03.02.2011, 03:55   #117
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

А так для 1000?
Код:
#include <iostream>
#include <cmath>
#include <cassert>

using namespace std;

/// Количество чисел с единичкой в промежутке [1; m*10^n]
int dikiy(int m, int n)
{
    assert(m >= 0);
    assert(n >= 0 && n < 10);
    if(m == 0) {
        return 0;
    } else if(n == 0) {
        return 1;
    } else if(m == 1) {
        double dn = double(n);
        return exp(dn * log(10)) - exp(dn * log(9)) + 1;
    } else {
        int tmp = dikiy(1, n);
        return tmp + (m - 2) * (tmp - 1) + pow(10, n) - 1;
    }
}

/// Количество чисел с единичкой в промежутке [1; x]
int fuckingFunc(int x)
{
    assert(x > 0);
    int result = 0;
    for(int i = log10(x); i >= 0; --i) {
        int tmp = x / pow(10, i);
        cout << "i = " << i << ", tmp = " << tmp << ", dikiy(tmp, i) = " << dikiy(tmp, i) << endl;
        x -= tmp * pow(10, i);
        result += dikiy(tmp, i);
        if(tmp == 1) {
            /* если текущая цифра -- 1, добавляем остаток к результату и всё,
             * ведь при реальном счёте всё в остатке начиналось бы на 1 */
            result += x;
            break;
        }
        
    }
    return result;
}

int main()
{
    int x;
    do {
        cout << "Enter fucking positive number: ";
        cin >> x;
    } while(x < 1);
    
    int result = fuckingFunc(x);
    
    cout << "Your answer is " << result << ", dumbass." << endl;
}
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 03.02.2011, 04:12   #118
Акоб
Форумчанин
 
Регистрация: 10.01.2011
Сообщений: 243
По умолчанию

то же самое)
Акоб вне форума Ответить с цитированием
Старый 03.02.2011, 04:16   #119
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Код:
#include <iostream>
#include <cmath>
#include <cassert>

using namespace std;

/// Количество чисел с единичкой в промежутке [1; m*10^n]
int dikiy(int m, int n)
{
    assert(m >= 0);
    assert(n >= 0 && n < 10);
    if(m == 0) {
        return 0;
    } else if(n == 0) {
        return 1;
    } else if(m == 1) {
        double dn = double(n);
        return int(exp(dn * log(10)) - exp(dn * log(9))) + 1;
    } else {
        int tmp = dikiy(1, n);
        return tmp + (m - 2) * (tmp - 1) + pow(10, n) - 1;
    }
}

/// Количество чисел с единичкой в промежутке [1; x]
int fuckingFunc(int x)
{
    assert(x > 0);
    int result = 0;
    for(int i = log10(x); i >= 0; --i) {
        int tmp = x / pow(10, i);
        cout << "i = " << i << ", tmp = " << tmp << ", dikiy(tmp, i) = " << dikiy(tmp, i) << endl;
        x -= tmp * pow(10, i);
        result += dikiy(tmp, i);
        if(tmp == 1) {
            /* если текущая цифра -- 1, добавляем остаток к результату и всё,
             * ведь при реальном счёте всё в остатке начиналось бы на 1 */
            result += x;
            break;
        }
        
    }
    return result;
}

int main()
{
    int x;
    do {
        cout << "Enter fucking positive number: ";
        cin >> x;
    } while(x < 1);
    
    int result = fuckingFunc(x);
    
    cout << "Your answer is " << result << ", dumbass." << endl;
}
а так?
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 03.02.2011, 04:17   #120
Акоб
Форумчанин
 
Регистрация: 10.01.2011
Сообщений: 243
По умолчанию

зачем нужно return exp(dn * log(10)) - exp(dn * log(9)) + 1;
не легче просто посчитать 10^n?

то же самое.



обьясни пожалуйста return tmp + (m - 2) * (tmp - 1) + pow(10, n) - 1;
Акоб вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подсчитать количество слов, в которые входит символ "е" Zhasik Паскаль, Turbo Pascal, PascalABC.NET 3 27.12.2010 10:29
Подсчитать количество букв "А" в предложении и общее количество букв.В тексте из файла несколько строк. kvas91 Общие вопросы C/C++ 3 14.11.2010 16:51
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04