Zamiana liczby w systemie dziewiątkowym na liczbe w systemie dziesiętnym.

0

Witam, mam taki mały problem. Otóż program, który napisałem nie poprawnie się sprawuje na liczbach, które w systemie dziesiętny podchodzą pod zakres long long int'a i nie wiem jaki jest tego powód, mógł by mi ktoś pomóc?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int kod[21], i=0;
    char z;
    unsigned long long wynik=0;
    puts("Podaj liczbe w kodzie dziewiatkowym.");

    while((z=getchar())!='\n')
    {
        z-=48; //zamiana z char na int
        if(z>=0&&z<=8)
        {
            kod[i]=z;
            i++;
        }
        else
        {
            puts("Zle dane.\nUruchom program jeszcze raz i podaj poprawne dane");
            i=0;
            return 1;
        }
    }

    for(int wykladnik=0, j=i-1; j>=0; j--)
    {
        wynik+=kod[j]*pow(9,wykladnik);
        wykladnik++;
    }

    printf("\nPodana liczba w systemie dziesietnym jest rowna: %llu\n\n", wynik);

    return 0;
}
0

A mógłbyś dokładniej opisać o co chodzi? Domyślam się że pewnie dla za dużych liczb źle konwertuje a to dlatego że zakres liczb typu unsigned long long jest ograniczony do 20 cyfr, a dokładniej zakres mieści się w granicy od 0 do 18 446 744 073 709 551 615.
Więc jak podasz 20-cyfrową liczbę dziewiątkową do konwersji to liczba dziesiętna już się nie zmieści w long longu i sensownego wyniku nie dostaniesz.
Skąd ci przyszedł do głowy taki pomysł konwersji z systemu dziewiątkowego? Mało toto spotykane.

0

Chodzi mi generalnie o liczby z zakresu i z tego co widzę to nawet dla liczb podobnych do ostatniej wartości signed long long'a są pewne rozbieżności. Na początku wzorowałem się na wynikach z kalkulatorów on-line ale one tęz mylą się na takich liczbach, więc napisałem swój program zamieniający z decymalnego na dziewiątkowy i też są rozbieżności na "dużych liczbach". Sam program to jest moje zadanie na zajęcia z programowania.

0

Ale liczby dziewiątkowe są z zakresu? Pewno się mylą bo podajesz za dużą liczbę dziewiątkową, która co prawda mieści się w zakresie, ale liczba dziesiątkowa po konwersji już nie. Można by sprawdzić jaką maksymalną liczbę dziewiątkową trzeba wpisać aby konwersja była prawidłowa.

0

Wszystko się mieści lecz mam wrażenie, że same programy(mam na myśli też te on-line) przy operacjach na tak dużych liczbach się mylą

0

Chyba problemem jest funkcja pow(), bo po przetestowaniu zauważyłem, że myli się przy wartościach >=9^20

1

Dobrze zauważyłeś, funkcja pow psuje wyniki bo przyjmuje i wypluwa wartości typu double, typ double ma rozmiar 64 bitów ale część idzie na ułamek, więc liczba cyfr będzie mniejsza, spróbuj napisać własną funkcję potęgującą, pracującą na unsigned long long.
Funkcja double myli się już przy wartościach 9^17, ale i tak ciągle nie przeskoczysz pojemności unsigned long long inta, więc maksymalne liczby do konwersji to liczby 20-cyfrowe. Pytanie czy można by to jakoś zwiększyć, tj żeby można było wpisywać jeszcze większe liczby?

0

to rozwiązało sprawę

unsigned long long int potega(int podstawa, int potega)
{
    unsigned long long int wynik;
    wynik=1;
    for(int i=1;i<=potega;i++)
    wynik=wynik*podstawa;
    return wynik;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0