Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поясните задание пожалуйста. 
V
    Опции темы
MadD1
Дата 26.11.2010, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.11.2010

Репутация: нет
Всего: нет



Добрый день.

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

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

Спасибо.

Это сообщение отредактировал(а) MadD1 - 26.11.2010, 12:14
PM MAIL   Вверх
xvr
Дата 26.11.2010, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(MadD1 @  26.11.2010,  12:14 Найти цитируемый пост)
Поясните пожалуйста, что от меня требуется? 
Видимо как то так:
12345678 -> 1233475678
После 56 и 78 цифры не вставленны, так как суммы (11 и 15 соотвественно) не являются простыми цифрами (цифра - это число, состоящее из 1 разряда)


Это сообщение отредактировал(а) xvr - 26.11.2010, 12:37
PM MAIL   Вверх
MadD1
Дата 26.11.2010, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.11.2010

Репутация: нет
Всего: нет



Спасибо большое, все ясно стало.
PM MAIL   Вверх
Леопольд
Дата 26.11.2010, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(MadD1 @  26.11.2010,  12:14 Найти цитируемый пост)
Поясните пожалуйста
http://ru.wikipedia.org/wiki/%D0%A6%D0%B8%D1%84%D1%80%D0%B0
Здесь не пришлось бы 20 минут ждать ответа. Достоверность ирформации не гарантируется, это свалка знаний, куда любой может "навалять"... smile Однако для ознакомления, и дальнейшего уточнения вполне подойдёт.


Это сообщение отредактировал(а) Леопольд - 26.11.2010, 12:52


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
MadD1
Дата 26.11.2010, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.11.2010

Репутация: нет
Всего: нет



В общем попробовал написать программу, знающих просьба оценить и посоветовать как ее улучшить\убыстрить..

Язык СИ.
Код

#include <stdio.h>

int main() {
long long int num, numinv = 0;
int g, nextsum,i=0,j=0,flag=0;

scanf("%lld", &num);

g = num % 10;
num /= 10;
if (g == 0) {
    g = 1;
    flag = 1;
}
numinv = numinv * 10 + g; 
i++;
while (num != 0) {
    g = num % 10;
    num /= 10;
    numinv = numinv * 10 + g;
    if (flag == 1) i++;
    
}

while (numinv != 0) {
    j++;
    nextsum = 0;
    g = numinv % 10;
    if ((flag == 1) && (i==j)) g--;
    printf("%d", g);
    nextsum += g;
    numinv /= 10;
    if (numinv != 0) {
        j++;
        g = numinv % 10;
        if ((flag == 1) && (i==j)) g--;
        printf("%d", g);
        nextsum +=g;
        numinv /= 10;
        if ((nextsum >= 0) && (nextsum <=9)) {
            printf("%d", nextsum);
        }
    }
}
printf("\n");
return 0;
}


P.S флаг для ситуаций типа 10000, так как при инверсии числа моим методом будет 1, с флагами же:
10000 => 10001 => 10001 => 00001, что позволит правильно выдавать суммы подряд идущих цифр в дальнейшем.

Спасибо заранее.

p.sss забыл добавить, что getchar() и массивы использовать нельзя, массивы тут не нужны нафиг, а вот от гетчара я бы не отказался, но увы, проходим сейчас конкретно обработку целых чисел.

Это сообщение отредактировал(а) MadD1 - 26.11.2010, 22:10
PM MAIL   Вверх
bsa
Дата 26.11.2010, 23:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Оформление кода, в частности, у тебя тело функции начинается на том же уровне отступов, что и операторные скобки функции. Объявление нескольких переменных через запятую. Операция, выполняемая по условию if на той же строке, что и сам if.
i++ или ++i
PM   Вверх
MadD1
Дата 27.11.2010, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.11.2010

Репутация: нет
Всего: нет



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

Если это был намек на то, что программа не читабельна, то переписываю smile
Мне очень интересно, можно ли сделать проще, чем я..

Код

#include <stdio.h>

typedef enum {NULLEND, NOTNULL} state; //Определяет состояние, является ли последняя цифра исходного числа нулем

int main() {
    long long int num, numinv = 0;
    int g, nextsum,i = 0,j = 0;
    state flag = NOTNULL;
    scanf("%lld", &num);
    g = num % 10;  //считываем последнюю цифру исходного числа
    num /= 10;
    if (g == 0) { //если последняя цифра - ноль, то делаем её единицей и меняем флаг
        g = 1;
        flag = NULLEND;
    }
    numinv = numinv * 10 + g; 
    i++;
    while (num != 0) {
    g = num % 10;
    num /= 10;
    numinv = numinv * 10 + g;
    if (flag == NULLEND) { //если флаг включен, нам надо считать количество цифр, чтобы потом вернуть ноль.
            i++;
        } 
    }
    while (numinv != 0) {
    j++;
    nextsum = 0;
    g = numinv % 10;
    if ((flag == NULLEND) && (i==j)) {
            g--;
        }
    printf("%d", g);
    nextsum += g;
    numinv /= 10;
    if (numinv != 0) { //второе условие в while нужно для доп. проверки, так как мы читаем по 2 символа
        j++;
        g = numinv % 10;
        if ((flag == NULLEND) && (i==j)) { //возвращаем ноль, учитывая состояние флага и равность номера символа
                g--;
            }
        printf("%d", g);
        nextsum +=g;
        numinv /= 10;
        if ((nextsum >= 0) && (nextsum <= 9)) { //определяем, является ли сумма цифрой
            printf("%d", nextsum); //печатаем
        }
      }
    }
    printf("\n");
    return 0;
}


Да чтож такое, из линуксовского gedit сюда криво вставляется, все равно есть недочеты в оформлении :(

Это сообщение отредактировал(а) MadD1 - 27.11.2010, 09:37
PM MAIL   Вверх
bsa
Дата 27.11.2010, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



MadD1, можно. ограничившись только одним циклом - через десятичный логарифм определяешь количество используемых разрядов (log(x)/log(10)). Затем через pow получаешь делитель нужного вида и вперед - от старших к младшим.
PM   Вверх
WhKitten
Дата 27.11.2010, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 24.11.2010

Репутация: нет
Всего: нет



С++ smile Кстати, ведь в условие задания не написано, что мы вводим число...
Код

#include <iostream>
#include <sstream>
#include <cctype>
#include <crtdbg.h>
using std::cin;
using std::cout;
using std::endl;
using std::isdigit;

// check that digit ascii code ordered one after another ascending
bool checkDigitAsciiCodeOrder()
{
    char d[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
    for (int i=1; i<sizeof(d); ++i)
        if (d[i]-d[i-1] != 1) return false;
    return true;
}

bool readCharAndCopy(std::istream& in, char* c, std::ostream* out = 0)
{
    char ch = 0;
    if (!in.get(ch) || in.eof())
        return false;
    else {
        if (c) *c = ch;
        if (out) *out << ch;
        return true;
    }
}

void insertSum(std::istream& in, std::ostream& out)
{
    _ASSERT(checkDigitAsciiCodeOrder());

    char ch[2];
    while (readCharAndCopy(in, &ch[0], &out))
    {
        if (!isdigit(unsigned(ch[0]))) continue;
        if (!readCharAndCopy(in, &ch[1], &out)) break;
        
        if (isdigit(unsigned(ch[1]))) {
            char sum = ch[0]-'0'+ch[1];
            if (isdigit(unsigned(sum))) out << sum;
        }
    }
}

int main(int argc, char** argv)
{
    std::ostringstream ss;
    cout << "Enter string (CTRL+Z, ENTER for finish):" << endl;
    insertSum(cin, ss);
    cout << "Result:" << endl;
    cout << ss.str() << endl;

    system("pause");
}


Это сообщение отредактировал(а) WhKitten - 27.11.2010, 15:50
PM MAIL   Вверх
Dov
Дата 27.11.2010, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(MadD1 @  27.11.2010,  08:36 Найти цитируемый пост)
Мне очень интересно, можно ли сделать проще, чем я..

Почему бы и не попробовать?
Код
int main()
{    
    int  num, digit, sum;
    bool b  = false;

    puts("Enter a number: ");
    scanf("%d", &num);
    
    for(int a = (int)pow(10, (int)log10(num)); a > 0; a /= 10)
    {
        sum   = digit;
        digit = num / a;
        num  %= a;
        printf("%d", digit);
        if(b && (sum += digit) < 10)
            printf("%d", sum);

        b = !b;
    }
    printf("\n");
    
    return 0;    
}




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.