Thuật toán đổi kiểu chuỗi (char) sang kiểu số (int) trong C++?

Như tiêu đề, mình muốn biết thuật toán chuyển kiểu như thế nào mà không dùng hàm atoi?

Dùng bảng ASCII để giải bài này bạn nhé

    int chuyen( char c)
    {
    return (int)c-48;
    }
2 Likes

Kiểu chuỗi thì là string chứ he, còn char là kiểu kí tự mà :smiley:

Chắc là chuỗi ký tự đó anh :joy: :joy:

Giải thích cho mình rõ tí đi bạn

Nếu vậy bạn có thể dùng kiểu như bạn @sample đã nói
Nhưng đó chỉ dùng được cho một kí tự
Mình giải thích giùm luôn là do mã ascii kí tự ‘0’ thì biểu diễn số là 48
Ví dụ như bạn có
char a=‘4’;
int n = a - ‘0’;
Thì khi đó nó sẽ chuyển định dạng kí tự về định dạng số theo mã ascii. Ký tự 4 thì mã là 52 trừ cho ký tự 0 mã là 48 ra được giá trị là 4.

1 Like

Nếu áp dụng cho bài toán chuỗi nhiều kí tự như ‘123’. Bạn hãy lấy từng phần từ từ đầu chuỗi tới cuỗi chuỗi, chuyển lần lượt về kiểu int. Mỗi lần lấy được một ký tự bạn lại thêm vào giá trị kết quả
Ví dụ:
n là giá trị ký tự vừa lấy
res là kết quả sau khi chuyển qua số, ban đầu gán bằng 0
Mỗi lần lấy ra được một ký tự bạn lại cộng thêm vào biến res theo công thức
res = res*10 + n

res*10 la ntn v ban?

Do bạn lấy theo thứ tự chuỗi từ đầu đến cuối
Ví dụ như có chuỗi a=‘123’
Lần đầu lấy ra ký tự đầu tiên đổi về int là 1
res = res*10 + n = 0*10 + 1 = 1
Lần hai lấy ra ký tự tiếp theo là 2
res = res*10 + n = 1*10 + 2 = 12
Lần ba lấy ra ký tự tiếp theo là 3
res = res*10 + n = 12*10 + 3 = 123
Thì khi trả về kết quả sẽ ra là 123

Nó in ra sai bạn ơi, xem hộ mình sai chỗ nào nhỉ?

  #include <iostream>
  #include <cstring>
  using namespace std;
  int chuyenKieu(char *s)
 {
int res = 0;
for(int i = 0; i < strlen(s); i++ )
{
	res = res*10 + s[i];
}
return res;
        }
      main()
       {
char *s = new char[30];
cout << "Nhap chuoi s[]: ";
cin.getline(s,29);
cout << "Chuoi sau khi chuyen: " << chuyenKieu(s);
       }
1 Like

chỗ này bạn phải để là
res = res*10 + (s[i]-‘0’)
Do s[i] lúc này là kiểu char nên nếu tính toán thì nó sẽ chuyển sang mã ascii nên kết quả ra không đúng

2 Likes

thanks bạn rất nhìu, để topic này đây có gì thảo luận với bạn tiếp hihi

cảm ơn anh Bùi Phú Hiệp
anh ơi cho em kb fb với anh đi

Cách đơn giản mà hiệu quả:
Theo bảng mã ASCII, mỗi ký tự có một mã số, may mắn là '0 - ‘9’ liền nhau, vậy nên chúng ta có thể lấy mã của một ký tự số, trừ đi mã của ký tự ‘0’ sẽ ra được số đó. (Chỉ áp dụng cho số 1 chữ số).
Mình thường dùng hàm này khai báo lên đầu chương trình:

 inline int num(char x){ return x - '0';}

Nếu muốn đổi chuỗi dài (dùng cho BigNum chẳng hạn) thì viết một hàm đổi đơn giản như sau:

int intValue(string  s){
    int res = 0;
    for(uint i=0;i<s.size();i++) res = res*10 + num(s[i]);
    return res;
}

Giải thích:
Ví dụ có số: n = 12, cần thêm số 3 vào cuối để tạo thành số 123.
Đầu tiên, bạn nhân 10 lên, sau đó cộng với 3:

12 x 10 + 3 = 123

Mở rộng, nếu bạn muốn ghép 2 số tự nhiên lại, bạn nhân số đầu với một số lũy thừa của 10, với số mũ đúng bằng số chữ số của số thứ 2. Ví dụ:

123 x 1000 + 456 = 123456
1234 x 100000 + 00056 = 12300056

bla bla
Code cho người lười:

#include <math.h>
inline int base10pow(int x){ return pow10(floor(log(x)/log(10)) +1 );}
inline int numcat(int a, int b){ return a*base10pow(b) + b;}

V làm sao để convert đc từ hệ hexa ra decimal dcc v ạ ? Vì hệ hexa nó ra tới A->F

Viết hàm chuyển tay nha bạn.

0…9 -> 0…9, A -> 10, B -> 11,…

3 Likes

A post was split to a new topic: Convert từ số sang xâu trong C
You should create a separated topic if your comment is not related to the original topic.

Old inactive topic.

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