01/10/2018, 14:48

Code Challenge nho nhỏ về Sum series

Challenge là, cho 1 số N bất kì hãy tính và in ra màn hình, ra file, ra giấy,…bla,bla,bla hay ra gì gì đó hok bít tổng từ 1…n với n chạy từ 1…N. Hết

Ví dụ cho n = 50 thì in ra màn hình
Tổng từ 1 đến 1, rồi tổng từ 1 đến 2,…cho đến tổng từ 1…49, 1…50. Và xử lý với 1 vòng lặp duy nhất. Cài đặt thuật toán vs bất cứ ngôn ngữ nào. Note: không dùng đệ quy

Nguyễn Bá Tùng (Mrbachtung) viết 17:04 ngày 01/10/2018

Đây là [code challenge] nhé, không phải hỏi bài tập. Và đây cũng là topic đầu tiên mà new mem mình xin chào sân với các bác…đấy ạaaaa

Kiii viết 16:48 ngày 01/10/2018

Bài của em đây ạ.

#include <stdio.h>

int main() {
    int n = 50;

    int k = 1;

    for (int i = 1; i <= n; ++i) {
        int sum = (i * (k + i)) / 2;
        printf("Tong tu %d -> %d = %d\n", k, i, sum);
    }

    return 0;
}
Nguyễn Bá Tùng (Mrbachtung) viết 17:00 ngày 01/10/2018

Ok, challenge tiếp theo là…Cho vòng lặp chạy tới n/2 thôi, nhưng in ra vẫn theo thứ tự 1 đến N.

Trần Hoàn viết 17:02 ngày 01/10/2018
var n = 50;
var k = 1;
for (double i = 0.5; i <= (double)n / 2; i += 0.5)
{
	int sum = (2 * i * (k + 2 * i)) / 2;
	System.Console.Writeline("Tong tu " + k + " → " + i * 2 + " = " + sum);
}
*grab popcorn* viết 16:52 ngày 01/10/2018
int main(void) {
  int s = 0;
  for(int i = 1; i < 51; i++) {
    s += i;
    printf("Sum 1 -> %d = %d\n", i, s);
  }
	return 0;
}
Nguyễn Bá Tùng (Mrbachtung) viết 16:57 ngày 01/10/2018

Không phải cộng từ 1 đến N nha bạn. Mà là cộng từ 1 đến gia số thứ i vs i chạy từ 1 đến N.

*grab popcorn* viết 16:51 ngày 01/10/2018

Thì code mình là vậy mà.

Nguyễn Bá Tùng (Mrbachtung) viết 17:02 ngày 01/10/2018

2 bạn trên kia cũng thuộc dòng cao thủ đây. Tự thấy mình còn gà con quá

phamvandung viết 17:02 ngày 01/10/2018

i = 1, s = 1
i = 2, s = s + i = 1 + 2 = 3
i = 3, s = s + i = 3 + 3 =…

*grab popcorn* viết 16:55 ngày 01/10/2018

Bài 2 luôn :3

int main(void) {
  int s = 0;
  for(int i = 0; i < 25; i++) {
    s += i * 2 + 1;
    printf("Sum 1 -> %d = %d\n", i * 2 + 1, s);
    s += i * 2 + 2;
    printf("Sum 1 -> %d = %d\n", i * 2 + 2, s);
  }
	return 0;
}
Nguyễn Bá Tùng (Mrbachtung) viết 17:00 ngày 01/10/2018

i = 1, s = 1
i = 2, s = s + i = 1 + 2 = 3
i = 3, s = s + i = 3 + 3 =…

Rất good và gọn, nhưng chỉ sử dụng nội trong trường hợp này thôi. Nếu dùng công thức như trên kia thì có thể tính tổng từ A đến B nguyên dương bất kì mà không cần vòng lặp hay đệ quy này nọ giúp tăng performance đáng kể.

Nguyễn Bá Tùng (Mrbachtung) viết 16:59 ngày 01/10/2018

var n = 50;
var k = 1;
for (double i = 0.5; i <= (double)n / 2; i += 0.5)
{
int sum = (2 * i * (k + 2 * i)) / 2;
System.Console.Writeline("Tong tu " + k + " → " + i * 2 + " = " + sum);
}

Nhiều bạn sao thik ép kiểu trong () thế ta, dùng 2.0 có nhanh hơn không, vì không nhất thiết dùng tới double trong trường hợp này mà.

Trần Hoàn viết 16:53 ngày 01/10/2018

Vì mình muốn viết hàm trong cả trường hợp n ≠ 50
Chú ý:
int / double → int
double / int → double

Nguyễn Bá Tùng (Mrbachtung) viết 17:00 ngày 01/10/2018

Nếu bạn muốn kiểu double thì dùng ép tường minh, còn như mình thấy nếu không phải dùng tới double thì cứ nhân chia gì đó cho một số thực để nó tự chuyển sang kiểu float là đủ xài.

Trần Hoàn viết 17:02 ngày 01/10/2018

Ồ, là do mình nhầm. int / double → double

Bài liên quan
0