1

Тема: Перестановка цифр у числі

Читаю Прата "Мова програмування С". Розділ функції. Задача, яка дана у книжці звелась, до пошуку протилежного числа.
Задача:
Вводиться ціле число з клавіатури. Програма повинна вивести протилежне число. Наприклад вводиться число 123 виводиться 321.
Я реалізував цю задачу так (через рекурсію):
1) вводиться число num
2) шукається найменше arg = 10^n при якому  num / arg = 0
3) функції, яка шукає обернене число передається num, arg та div = arg
     а) створюється змінна d = div / 10
     б) якщо при d не дорівнює 0, то продовжується виконання функції, якщо дорівнює 0, то повертається 0.
     в) result = (num % div) / d
     г) div з кожним викликом функції повинна зменшуватись у 10 разів, тому div = d
     д) зворотнє число обчислюється за формулою result = result * arg / (div * 10) + conserveNumber (num, arg, div)
При введенні 123 обчислення будуть такими:
1) (123 % 1000) / 100 = 1
2) (123 % 100) / 10 = 2
3) (123 % 10) / 1 = 3
4) 3 * 1000 / (1 *10) = 300
5) 2 * 1000 / (10 * 10) = 20
6) 1 * 1000 / (100 * 10) = 1
7) 300 + 20 + 1 = 321
Ось такий алгоритм в мене вийшов. Я думаю, що це не правильний алгоритм. Кривий алгоритм.
Будь ласка, підскажіть, як краще організувати виконання даної задачі.
Код:

/* Тип int! Виведення обернутого числа до введеного (наприклад введено 123 - виведено 321) */
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int conserveNumber (int num, int arg, int div);
int initArg (int num);

int main (void){
    int num, arg, div, opp;
    printf ("Enter number: ");
    while (scanf ("%d", &num) != false){
        while (num / 10 == 0){
            printf ("Enter number more than 10: ");
            if (scanf ("%d", &num) != true){
                printf ("Error\n!");
                exit (1);
            }
        }
        arg = initArg (num);
        div = arg;
        opp = conserveNumber(num, arg, div);
        printf ("Number = %d\n", opp);
        printf ("Enter number: ");
    }  
    return 0;
}

int initArg (int num){
    int arg;
    int i;
    for (arg = 10, i = 1; (num % arg) / i != 0; arg *= 10, i *= 10)
        ;
    return arg / 10;
}

int conserveNumber (int num, int arg, int div){
    int result;
    int d = div / 10;
    if (d != 0)
         result = (num % div) / d;
    else return 0;   
    div = d;
    result = result * arg / (div * 10) + conserveNumber (num, arg, div);   
    return result;
}

2 Востаннє редагувалося 0x9111A (27.01.2016 11:43:05)

Re: Перестановка цифр у числі

printf ("Enter number more than 10: ");

Це чому? Не бачу такого в умові.

Ну якщо число треба просто вивести то як вам такий варіант

    int a = 0;
    scanf("%d", &a);
    a = (a < 0) ? -a : a; // надіюсь зрозуміло нащо це 

    while (a) {
        putchar((a % 10) + '0');
        a /= 10;
    }

ideone.com

Так само можна й зберегти

    int a = 0, b = 0;
    scanf("%d", &a);
    a = (a < 0) ? -a : a;
 
    while (a) {
        b = b * 10 + (a % 10);
        a /= 10;
    }
    
    printf("%d\n", b);

ideone.com

Подякували: koala, GVIG, vov4ok, leofun014

3

Re: Перестановка цифр у числі

Про всяк випадок додам, що кількість цифр в числі - це десятковий логарифм плюс один, відповідно,

#include <cmath>
...
arg = (int)pow( 10, (int)log10( num ) + 1);

Ну а по суті вже відповіли.

Подякували: 0x9111A, vov4ok, GVIG, FakiNyan, leofun015

4

Re: Перестановка цифр у числі

Дякую!
Зараз буду розбиратись.
Про кількість цифр в числі через десятковий логарифм я зовсім не знав... Величезне спасибі!!!!

5 Востаннє редагувалося GVIG (27.01.2016 13:45:23)

Re: Перестановка цифр у числі

0x9111A написав:

Так само можна й зберегти

    int a = 0, b = 0;
    scanf("%d", &a);
    a = (a < 0) ? -a : a;
 
    while (a) {
        b = b * 10 + (a % 10);
        a /= 10;
    }
    
    printf("%d\n", b);

Набагато простіший варіант, ніж в мене вийшов. Я навіть не міг подумати, що може бути так легко. Дякую!

6

Re: Перестановка цифр у числі

GVIG, раджу почитати K&R будете вміти так само і краще.

Подякували: GVIG, Betterthanyou2

7

Re: Перестановка цифр у числі

З типом int все більш менш зрозуміло, а от з типом double.
Як зробити так, щоб 1.234 став 432.1????? Я зовсім не маю ідей....

8

Re: Перестановка цифр у числі

0x9111A написав:

GVIG, раджу почитати K&R будете вміти так само і краще.

Я починав читати K&R, але знаннь, які в мене були про С (пів року читали С в універі) виявилось не достатньо, щоб вирішувати ті задачі які пропонувались у книгі. Тому я вирішив спочатку прочитати Прата (тут все розжовується і зрозуміло), а потім прочитати K&R.

9 Востаннє редагувалося -=ЮрА=- (27.01.2016 23:57:37)

Re: Перестановка цифр у числі

З типом int все більш менш зрозуміло, а от з типом double.
Як зробити так, щоб 1.234 став 432.1????? Я зовсім не маю ідей....

#include <iostream>
using namespace std;

int main(){
    float  val = 105.2560f;
    long ipart = (long)val;
    unsigned long fpart = 0;
    long lvalue= 0;
    val = val - ipart;
    while( val )
    {
        val *= 10;
        lvalue = (long)val;
        fpart *= 10;
        fpart = fpart + lvalue;
        val   = val   - lvalue;
    }
    while( fpart )
    {
        cout<<fpart % 10;
        fpart /= 10;
    }
    cout<<".";
    while( ipart )
    {
        cout<<ipart % 10;
        ipart /= 10;
    }
    return 0;
}

http://codepad.org/PvltitDG
Звичайно ж числа з плаваючою комою мають плаваюче представлення тобто завжди присутня похибка

7732483233.501

Подякували: GVIG1

10

Re: Перестановка цифр у числі

А взагалі краще все перетворювати у рядок і працювати саме з чарами, якщо цікавить "тільки надрукувати"

#include <string>
#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    float val = 1.4306f;
    string line;
    stringstream ss;
    ss<<val;
    ss>>line;
    cout<<"input   : "<<line<<endl;
    reverse(line.begin(), line.end());
    cout<<"reverce : "<<line<<endl;
    
    return 0;
    
}

http://codepad.org/QZ1CPcx8

input   : 1.4306
reverce : 6034.1

Подякували: VTrim, GVIG2

11

Re: Перестановка цифр у числі

Дійсно, чому просто не перетворити у "рядок" та навіть просто пройтись циклом від останнього до першого символу.

12 Востаннє редагувалося GVIG (29.01.2016 19:17:57)

Re: Перестановка цифр у числі

-=ЮрА=- написав:

А взагалі краще все перетворювати у рядок і працювати саме з чарами, якщо цікавить "тільки надрукувати"

Ні не цікавить "тільки надрукувати". Цікавить саме створити обернене число і записати його у змінну. Дякую за відповідь!