Форум программистов, компьютерный форум CyberForum.ru

Удалить из числа вхождение первой цифры - C++

Восстановить пароль Регистрация
 
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
17.02.2013, 11:51     Удалить из числа вхождение первой цифры #1
Нужно из числа удалить все вхождения первой цифры.
Например в числе 123123 первая цифра = 1, мы удаляем её и её вхождения в число и получаем в итоге число 2323.
Всё бы хорошо, но хотят чтобы удалили эту первую цифру из числа НЕ конвертируя число в строку.

Есть какие-то идеи по поводу алгоритма ? Меня что-то заводит в тупик такое издевательское задание
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2013, 11:51     Удалить из числа вхождение первой цифры
Посмотрите здесь:

из числа n удалить все четные цифры C++
Сумма первой и последней цифры числа C++
Дано натуральное N. Составить программу для поиска первой цифры этого числа C++
C++ дано натуральное число пи. найти сумму первой и последней цифры этого числа.
Найти двузначные числа, у которых сумма удвоенного квадрата первой цифры и квадрата второй цифры равен самому числу C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Karuselia
 Аватар для Karuselia
24 / 10 / 1
Регистрация: 21.05.2012
Сообщений: 37
17.02.2013, 11:58     Удалить из числа вхождение первой цифры #2
А записать число в массив нельзя?
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
17.02.2013, 12:23     Удалить из числа вхождение первой цифры #3
в цикле находим самую старшую степень в числе и остаток от ее делени, после чего вычитаем получившее число из исходного
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "iostream"
using namespace std;
int main()
{
    int x=12345;
    int temp=0,num=0, power=1;
    temp=x;
    while(temp) {
        num=temp%10;
        power*=10;
        temp/=10;
    }
    cout<<"\n" << x-num*power/10 << endl;
    return 0;
}
без претензий к эффективности кода, просто как идея, правильней считать показатель степени потом в цикле получить самого значение
Karuselia
 Аватар для Karuselia
24 / 10 / 1
Регистрация: 21.05.2012
Сообщений: 37
17.02.2013, 12:30     Удалить из числа вхождение первой цифры #4
А все остальные вхождения?) Первое вхождение то удалить можно... А вот все остальные..Загадка)
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
17.02.2013, 12:33     Удалить из числа вхождение первой цифры #5
Не дочитал задание :)
Karuselia
 Аватар для Karuselia
24 / 10 / 1
Регистрация: 21.05.2012
Сообщений: 37
17.02.2013, 12:40     Удалить из числа вхождение первой цифры #6
Первую цифру можно вычислять так. Затем такой же цикл, только с прибавлением остатка к остатку помноженного на степени 10. Ну с кучей условий и вторым вложенным циклом.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
17.02.2013, 12:43  [ТС]     Удалить из числа вхождение первой цифры #7
vua72, видишь ли какое дело, нужно удалить не только первое вхождение цифры, но и последующие с чему у меня и возникла проблема ...
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
17.02.2013, 13:28     Удалить из числа вхождение первой цифры #8
самое простое, что напрашивается это как-то так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
unsigned fix( unsigned d )
{
    unsigned res = 0;
    unsigned first = d;
    unsigned factor = 1;
 
    while( first > 10 ) {
        first /= 10;
        factor *= 10;
    }
    while( factor ) {
        unsigned next = (d / factor) % 10;
        if( next != first ) {
            res = res * 10 + next;
        }
        factor /=10;
    }
    return res;
}
Добавлено через 11 минут
второй способ - использовать то, что уже знаешь.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
unsigned fix2( unsigned d )
{
    unsigned res = 0;
    unsigned first = d;
 
    unsigned tmp[32];
    unsigned id = 0;
 
    while( first > 10 ) {
        tmp[id++] = first % 10;
        first /= 10;
    }
    for( ; id > 0; --id ) {
        if( tmp[id - 1] != first ) {
            res = res * 10 + tmp[id - 1];
        }
    }
    return res;
}
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
17.02.2013, 15:00     Удалить из числа вхождение первой цифры #9
с можно и так, правда в коде много лишнего, но идея понятна

Добавлено через 10 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <deque>
struct number {
    int num;
    int pow; //в этой задаче не нужно, но вдруг понадобится удерживать степени
} decn;
 
int pown( int x)
{
    int res=1;
    for (int i=1; i<x; ++i)
        res=res*10;
    return res;
};
 
using namespace std;
int main()
{
    std::deque <number> numb;
    std::deque <number>::iterator it;
    auto x=1213145;
    auto temp=x, num=0, power=1;
    while(temp) {
        decn.num=temp%10;
        decn.pow=power;
        numb.push_front(decn);
        temp/=10;
        ++power ;
    }
    auto cond=numb.front().num;
    for( it=numb.begin(); it!=numb.end(); ++it)
        if (it->num == cond)
            numb.erase(it);
    auto i=1;
    for( it=numb.end()-1; it>=numb.begin(); --it) {
        num= num + (it->num) * pown(i++);
    }
    cout << "x= "<<x<<" res="<< num<<endl;
    return 0;
}
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
17.02.2013, 23:33  [ТС]     Удалить из числа вхождение первой цифры #10
Спасибо за подсказки, хотя мне что подсказывает что хотели чтобы массивы не использовались (ну а коллекции с++ и подавно), но попробую отдать так и узнаю что скажут. Если скажут что таки надо выворачиваться без массивов то я подниму тему, я сам изначально сделал с char массивом и копированием через strncpy, вот так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/*
* 1. Дано натуральное число n. Удалить из записи числа все вхождения первой цифры.
* Подсчитать кол-во оставшихся цифр в изображении числа.
*/
 
int main()
{
    //считываем число что вводит пользователь
    int number = 0;
    printf("Enter number:\n>> ");
    scanf("%i",&number);
 
    //переводим число в строку
    char buffer[32];
    itoa(number,buffer,10);
 
    //запонимаем цифру которую нам нужно удалять из числа
    char firstSymbol = buffer[0];
 
    //удаляем первую цифру из числа
    strncpy(buffer,buffer+1,strlen(buffer));
 
    //удаляем цифры из числа если цифра совпадает с первой
    int i;
    for( i=0; i<strlen(buffer);i++)
        if(buffer[i] == firstSymbol)//если цифра такая же как и была первая цифра в числе
        {
            strncpy(buffer+i,buffer+i+1,strlen(buffer)-i);//копируем число со сдвигом на 1
            i--;//уменьшаем счётчик так как при сдвиге мы получается "пропустили" одно число
        }
 
    //в конце выводим результат: число после удаления первой цифры и длину числа
    printf("After delete number = %s, number lenght = %i\n",buffer,strlen(buffer));
 
    getchar();
 
    return 0;
}
Но преподавателю это не понравилось, мол первое задание, а тут такие функции что ещё якобы не изучались. В общем бред как всегда, ненавижу задачи из ряда "решить задачу, но не использовать [первое, второе, ... десятое])."
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.02.2013, 00:29     Удалить из числа вхождение первой цифры
Еще ссылки по теме:

Исключить из числа цифры, стоящие между первой и последней цифрой числа. Использовать классы C++
C++ Дано натуральное число л. Найти сумму первой и последней цифры этого числа
Дано натуральное число n. Найти сумму первой и последней цифры этого числа C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
18.02.2013, 00:29     Удалить из числа вхождение первой цифры #11
Для препода и нас заумных )
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
int main() {
    int x = 123145;
    int temp = x, flag, num = 0, power = 1;
    while (temp) {
        temp /= 10;
        if (temp)
            flag = temp;
        cout << temp << endl;
    }
    temp = x;
    cout << "old x=" << temp << "\nflag=" << flag<<endl;
    x=0;
    while (temp) {
        num = temp % 10;
        if (num != flag) {
            x += num * power;
            power *= 10;
        }
        temp /= 10;
    }
    cout << "new x =" << x;
    return 0;
}
Добавлено через 5 минут

Не по теме:

М-да уж, иногда простую задачу так решишь.... Мне мое первое решение напомнило Hello World в недавних темах.

Yandex
Объявления
18.02.2013, 00:29     Удалить из числа вхождение первой цифры
Ответ Создать тему
Опции темы

Текущее время: 11:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru