Chuyển đổi hexadecimal sang decimal với số cực lớn

Chào mọi người em có một bài tập convert hexa to decimal với số cần chuyển là: 7ffffffffffffffff (16 chữ f )

em có code như này nhưng chỉ đc 15 chữ F nếu để kiểu dữ liệu là unsigned long long Nhưng bị sai nếu convert những số nhỏ(3F). Còn nếu để int thì số nhỏ (3F) đúng còn số to sai(16 chữ F).

void HexadecimalToDecimal() {
    int p, j;
    int i;
    int k=0;
    char n[50];
    do {
        printf("\tEnter Hexadecimal number:");
        fpurge(stdin);
        gets(n);
    unsigned long long int decimal[50];
    j = 0;
    for (i = strlen(n) - 1; i >= 0; i--) {
        if (isdigit(n[i]))
            p = n[i] - 48;
        else if (isupper(n[i]))
            p = n[i] - 55;
        else if (islower(n[i]))
            p = n[i] - 87;
        decimal[k] = p * pow(16, j);
        k=k+1;
        j++;
    }
    unsigned long long int decimall;
    for(int n=0; n <= k; n++){
        decimall=decimal[n]+decimall;
    }
    printf("\tDecimal number is: %lld\n", decimall);
}

int main(int argc, char** argv) {
                HexadecimalToDecimal();

    return 0;
}

giá trị sai thế nào, giá trị đúng thế nào :V

à em quên khởi tạo giá trị 0 cho decimal[50]decimall nên ban đầu nó chứa giá trị rác, có lúc chạy đúng có lúc chạy sai, ko liên quan gì tới kiểu int hay long long hết :V

sửa lại thêm mấy chữ = {} với = 0 là được :V

unsigned long long int decimal[50] = {};
...
unsigned long long int decimall = 0;
5 Likes

À em thiếu nhưng em gán giá trị biến decimall = 0 rồi vẫn sai.
Còn mảng thì k cần khởi tạo giá trị a ạ :))

1 Like

em tim ra loi sai roi. Nhung chua tim ra cach convert so lon hon.
sua nhu nay la duoc:

unsigned long long int decimall;
    for(int n=0; n < k; n++){
        decimall=decimal[n]+decimall;
    }
1 Like

n <= k sai thì anh ko thấy thật :V nhờ khởi tạo decimal[50] thành 0 nên mà có + decimal[k] là +0 cũng ko ảnh hưởng gì. Sửa n < k thì ko cần khởi tạo decimal[50] thành 0 hết nữa, nhưng decimall phải khởi tạo = 0 nha :V Viết thế này unsigned long long int decimall; thì có thể 90% nó mang giá trị 0, 10% nó mang giá trị khác 0, em chạy 9 lần ra đúng ko phải lần thứ 10 nó ra đúng đâu :V

vd em sửa lại thành int hết lần nào chạy nó cũng ra giá trị rác :V Ko rõ tại sao để int 64-bit nó lại ra đúng rất nhiều lần nhỉ :joy:

int decimal[50];
...
int decimall; // nếu viết là int decimall = 0; thì ko bị ra giá trị rác nữa
5 Likes

đúng là cái decimall cần khởi tạo = 0. Nhưng n < k mới là đúng a à. Với cả em cũng chỉ chạy được 7fffffffffffffff (15 f ) là max. EM vẫn chưa tìm ra cách để nó chạy được nhiều giá trị hơn. Còn nếu để int thì giá trị chứa của nó quá nhỏ nên k áp đụng đc bài này vì vậy nó tràn ô nhớ nên mới có giá trị khác ạ

nhiều hơn thì em làm cái mảng rồi tính như phép nhân tiểu học ấy :V

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?