Cần hỗ trợ tìm lỗi sai trong code tính 1 + (1 + 2) + (1 + 2 + 3) + . . . + (1 + 2 + 3 + . . . + n)

Đề: S4 = 1 + (1 + 2) + (1 + 2 + 3) + . . . + (1 + 2 + 3 + . . . + n)
Yêu cầu nhập số nguyên dương n, tính S4.

Em hiện đang học lập trình c++ buổi thứ 5, hiện đang học về vòng lặp, chưa học các loại cú pháp khác. Hướng giải của e chia nhỏ từng biểu thức trong ngoặc kép ra, biểu thức sau thì bằng biểu thức trước tăng thêm 1 đơn vị, nên e làm như sau nhưng không ra kết quả, các tiền bối xem e viết sai chỗ nào nhen.
P/s: sau 1 hồi sửa giải sửa giải cuối cùng cũng chạy được, cảm ơn các bạn và tiền bối giúp đỡ ạ. Cái bài này làm 2 ngày mới ra :cry: không biết mốt thi làm đủ giờ không luôn

#include<iostream>
using namespace std;

int main(){
	int n;
	do{
		cout << "Nhap so nguyen duong: ";
		cin >> n;
	} while (n <= 0);
	
	int result = 0, tempSum = 0;
	for (int i = 1; i <= n; i++){
       tempSum += i;
       result += tempSum;
}
cout << "S4 = " << result;
}
1 Like

Điều kiện while(true) của cậu không bao giờ thoát ra được, do i không bao giờ lớn hơn n.
Cậu check lại điều kiện nhé!

6 Likes

theo mình nghĩ thì để while thoát ra thì cần 1 điều kiện sai để nó ngừng lại :thinking: :thinking: :thinking: chẳng lẽ cách nghĩ của mình bị sai hử @@ nếu để điều kiện đúng thì nó chạy hoài chứ ha @library

Đây là lý do tại sao mọi người cần học lưu đồ thuật toán trước này. Bạn thử vẽ lưu đồ đoạn code while(true) đó rồi truy theo các chiều mũi tên để biết tại sao nha.

4 Likes

cái đó vẽ sao bạn, mình chưa được dạy cái đó, thầy chỉ bảo viết code giống cách tính toán thông thường thôi, ở ngoài giải sao thì lên code viết vậy @Stanley00

Và cái nữa, bạn có thử tự hỏi khi i=1 thì nó chạy như nào không? Lúc đó while(true) của bạn sẽ chạy tới lúc đứng máy thì thôi.

2 Likes

vậy giờ mình đổi thành while (i == n) thì break, tại mình đang nghĩ là khi i = 1 thì tong4 cũng cộng cho 1 xong x lại cộng thêm giá trị của tong4, mỗi lần i++ thì tong4 ra giá trị mới xong cộng chồng vào x. @lqcuong99

Bạn nên tìm hiểu vòng lặp while và for nó chạy như thế nào. Ở code trên bạn đổi while(i==n) thì khi chạy vào vòng for i=1 thì vòng while nó cũng sẽ lặp vô tận, tức khi i=1 thì nó sẽ vào while mà trong vòng lặp while của bạn thì không tăng biến i nên nó cứ i=1 mà nó lặp while thôi

Với cách giải bài này của bạn cũng sai rồi.

1 Like

vậy bạn chỉ hướng giải cho mình bài này đi. Ngoài cách cộng chồng lên thì mình chưa nghĩ ra cách khác. Giờ mình cũng chỉ đang nghĩ có thể dùng For xong rồi thêm 1 cái for nữa để cộng chồng lên không biết giải ra không thôi

Vì vậy mới học cần làm lưu đồ :smiley: để suy nghĩ nó rõ ràng.

6 Likes

Mình nghĩ bạn trước tiên nên lấy giấy ra giải thử, giải ra bài đó xong hãy code tay.
Còn không thì bạn có thể tham khảo code này:

		int tong = 0;
		int temp=0;
		for (int i = 1; i <= n; i++) {
			temp+=i;
			tong+=temp;
		}

n lớn thì chết nhỉ, bạn nên làm theo cách giải của @rogp10

1 Like

Cách 1:

\Delta S(x)= \frac{(x+2)(x+1)}{2} = \frac{\Delta (x+2)(x+1)(x)}{6}\\ S_n = \sum^{n-1}_{x=0} \Delta S(x) = \frac{(n+2)(n+1)n}{6} - \frac{2\cdot 1\cdot 0}{6} = \frac{(n+2)(n+1)n}{6}

Cách 2:

\nabla S(x) = \frac{(x+1)x}{2} = \nabla \frac{(x+2)(x+1)x}{6}\\ S_n = \sum^{n}_{x=1}\nabla S(x) = \frac{(n+2)(n+1)n}{6} - \frac{2\cdot 1\cdot 0}{6} = \frac{(n+2)(n+1)n}{6}

@lqcuong99

4 Likes

Hm, ý tưởng của cậu đúng, nhưng cách implement lại vô cùng tồi tệ.
Tớ sẽ hỏi cậu 1 vài câu hỏi, cậu thử trả lời và xâu chuỗi xem nhé!

  • Tại sao tên biến lại là tong4? Sao không phải là tongThanhPhan
  • Tại sao tên biến lại là x? Tại sao không phải là result?
  • Giờ quên hết implement hiện tại của cậu, để tính tổng thành phần, cậu làm thế nào? Viết code phần này cho tớ được không?
  • Sau khi tính được tổng thành phần, làm thế nào để cậu cộng dồn vào kết quả?

Bài học mà cậu nên học ở buổi đầu tiên khi lập trình là “chia để trị”. Cậu cần thực hiện từng bước nhỏ một, như tớ đã đề cập ở mục câu hỏi, trước khi lao vào viết code, và ngồi cầu nguyện cho nó chạy đúng :smile:

Thử xem nhé!

5 Likes
  • tại vì nguyên cả bài có tổng cộng 4 phép tính, mình tách ra 1 phần nhỏ tại 3 phần kia đều ổn rồi, tới phép tính cuối lại tính không ra nên giữ nó thành tong4 để phân chia với 3 phần còn lại =))) nó là 1 bài chung nên giải xong cũng phải ghép nó lại thành 1 bài ý mà =)).

còn vụ x thì mình quen suy nghĩ tính theo cách giải trên giấy chưa đổi thành cách trình bày trên lập trình nên hay giữ lại thói quen cũ, đang từ từ sửa :sweat_smile:

để tính tổng thành phần thì mình đang nghĩ là khi i = 1 phù hợp điều kiện i <= n thì tempSum += i tiếp đó sum += tempSum sau đó i++ lại xét tiếp điều kiện i <= n, nếu sai điều kiện thì cout sum ra

int result = 0, tongThanhPhan = 0;
for (int i = 1, i <= n, ){
       tongThanhPhan += i;
       result += tempSum;
       i++;
}
cout << "S4 = " << result;

e dở toán a ơi, cái công thức a đưa ra là để giải bài này hay là công thức chung để giải những bài tích lũy giống vậy hả a @rogp10 @@ e nhìn không hiểu lắm

Trong dãy sẽ có:
n số 1
n -1 số 2
n - 2 số 3

n - (n - 1) số n
Bạn suy nghĩ theo cách này sẽ dễ hơn.

1 Like

ok thks bạn, mình hiểu cách này nhưng chưa nghĩ ra nếu áp dụng vào các cú pháp sẽ như thế nào, mình mới nghĩ được là nếu theo 1 tăng tới n thì dãy bên trái sẽ là từ n giảm 1. Dùng 2 hàm For for để tính tổng các số phải không bạn. @Mtuongpk

Bạn để ý kỹ dòng này nhé, không phải ngẫu nhiên mà mình ghi vậy thay vì ghi 1 số n đâu.
n - (n - 1) số n
1 vòng for duy nhất để tính tổng. Bạn dựa vào đây tìm quy luật nhé. Cứ lấy giấy làm thử với n nhỏ trước. Nếu kết quả đúng thì thử với n lớn hơn. Nếu cái thứ 2 cũng cho ra kết quả đúng thì khả năng đấy chính là cái quy luật cần tìm.

1 Like

chắc mình chưa quen nên tạm tách thành 2 cái for, để làm nhiều quen thuộc rồi mới ghép thành 1 cái for được á :grin: :grin: :grin:

int tempSum = 0, sum = 0;
	for (int i = 1; i <= n; i++){
		for (int k = n ; k >= (n-(n-1)); n--){
			tempSum = i*k;
			sum += tempSum;
		}
	}
	cout << "S4 = " << sum;

Hm, tớ nghĩ tớ chỉ đang hỏi:

Ở đây không nên có result. Tớ chỉ đang hỏi về tongThanhPhan thôi.
Kết quả nên thế này:

int tongThanhPhan = 0;
for (int i = 1; i <= n; i++){
       tongThanhPhan += i;
}
cout << "Tổng từ 1 tới n = " << tongThanhPhan;

Giờ, cậu có thể trả lời tớ câu này không? Sau khi cậu có 1 loạt tongThanhPhan, thì:

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