Tính trung bình cộng các số có mặt trong chuỗi

Cho 1 chuỗi kí tự (gồm chữ hoa, thường và số). tính trung bình cộng các số có mặt trong chuỗi đó.
VD: thu2ngay7thang4nam2018 (2+7+4+2018)/4

vì sao bạn nhìn vào chuỗi “thu2ngay7thang4nam2018” lại ra được kết quả “(2+7+4+2018)/4”
tại sao không phải là một kết quả khác mà lại là những con số đó? bạn đã làm như nào để ra được như vậy?

4 Likes

bạn thử dùng ngược lại như là: nếu kí tự (không >a và <z ) và (không >A và <Z ) thì kí tự đó là số

3 Likes

Gọi chuỗi vào là input.
Tạo một chuỗi tạm tmp = null.
Tạo một mảng kiểu số number.

Duyệt input, kiểm tra input[i] có phải là chữ số không:

  • Nếu là chữ số thì thêm nó vào tmp.
  • Nếu không phải thì chuyển chuỗi tmp thành số rồi đưa vào number, sau đó cho tmp rỗng.
4 Likes

•cho chuỗi đó thành 1 mảng kí tự input
• tạo một ArrayList output
• tạo một mảng kí tự temp để chứa mỗi lần 1 chữ số.

Duyệt input, nếu java thì dùng hàm isLetter(...) nếu trả về false thì add vào temp vì nó là số ( có thể không đúng nếu có ký tự @#₫& …), hoặc quy ra mã ASCII thì số sẽ nằm trong khoảng 48 –> 57. sau khi temp đã đầy thì add số đó vào output
Cuối cùng lấy các phần tử của output đó cộng lại chia cho size của output

chương trình sẽ chạy như này : thang4nam2018 sẽ thành input[] {t,h,a,n,g,4,n,a,m,2,0,1,8}
1/ xét từng phần tử :
•t,h,a,n,g --> false không phải số
•4 —> true --> bắt đầu add vào temp
•n ----> false --> ngừng add vào temp
•add temp vào arraylist output
•xoá temp
• tiếp tục a,m --> false
• 2 —> true —> bắt đầu add vào temp . tương tự temp cuối cùng sẽ là 2,0,1,8
• add temp vào output
vậy là ta đã có một Arraylist output [4, 2018]

cuối cùng kết quả là sum của các phần tử output chia cho output.size()

ngoài ra cần tạo thêm hàm phụ : mảng char[] thành integer

3 Likes

tạo arrayList Output làm gì đâu, đề chỉ yêu cầu tính tbc thôi mà, tạo array cho tốn bộ nhớ

3 Likes

so sánh luôn với ‘0’ & ‘9’ ý, char[i] >= ‘0’ && char[i] <= ‘9’ => return true

2 Likes

chưa hiểu ý bạn lắm, nếu vậy thì làm sao tách và lưu được 2, 7, 4, 2018 riêng biệt

Vẫn làm như bạn thôi, nhưng thay vì

thì cho sum += temp;
count++;
Vì đề bài k yêu cầu xuất ra các giá trị nên k cần lưu, còn nếu yêu cầu có in ra thì làm như bạn là ok rồi

2 Likes

đề cho input output như vậy ạ

cảm ơn mọi người :smiley:

bạn nói như vậy là thua rồi
lập trình chỉ là công cụ giúp tính toán nhanh hơn mà thôi, còn tính toán như thế nào thì vẫn là nằm ở con người, bạn còn không chịu giải bằng tay cho sample coi nó ra như vậy có đúng không thì lập trình gì nữa giờ

2 Likes

Nếu là (2+7+4+2+0+1+8)/7 thì đơn giản, chỉ cần duyệt input từ input[0] đến ‘\0’, ký tự nào là số thì convert nó rồi cộng dồn lại :

int sum = 0, count = 0 , len = strlen[input]-1, c = 0;
for( i = 0 ; i < len ; i++) {
   if( input[i] >= 0x30 && input[i] <=0x39) {
      c = input[i] - 0x30; // convert ký tự sang số 
      sum+= c;
      count++;
 }
}

if( count > 0)
     sum = sum/count;  // tính trung bình cộng

Còn là 2018 thì phức tạp hơn nhiều. Bây giờ giả sử mình có chuỗi “1tuantruoc10122019U22 vietnamvodichseagame30” mà yêu cầu output là (1+10+12+2019+22+30)/6 thì …bó tay:D

2 Likes

cái đó mình thiếu rồi. vì trong ví dụ có số 2018 nên chắc thêm vài if else vào nữa

Cho if vào trong vòng while, làm như thuật toán của bạn @coderTapSu hướng dẫn đó.

1 Like

Đề bài là 1 chuỗi gồm số và chữ. K viết tách ra thì tính là 1 số thôi. Còn nếu muốn là như bạn thì cần kiểm tra xem 1 chuỗi số đó có phải ngày tháng k? Vậy đề cũng phải cho có định dạng 01012019 hay 112019… Nói chung mục đích bài này chỉ kiểm tra char[i] là số hay chữ, nếu là số có nhiều chữ số thì nhận biết đc. Đề k cần mang tính đánh đố, vì nó k thu đc kết quả gì, thuật toán cũng chỉ vậy.

3 Likes
  1. Extract numbers from a string: https://stackoverflow.com/questions/13399594/how-to-extract-numbers-from-string-in-c
  2. Tính trung bình cộng thì quá dễ rồi, khỏi cần search code.
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?