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😀

1 Like

Đâ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 :smiley:

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;
}
1 Like

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.

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);
}
2 Likes
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;
}
5 Likes

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.

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

4 Likes

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á :baby_chick:

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

3 Likes

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;
}
6 Likes

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ể.

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à.

1 Like

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

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.

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

1 Like

Cách 1:
Tổng các bình phương P(n) = 12 + 22 + … + n2 = n(n+1)(2n+1) / 6.
Tổng các số nguyên dương S(n) = 1 + 2 + … + n = n(n+1) / 2.
Do đó, S(n) = 3P(n) / (2n+1).

#include <iostream>
int main()
{
    int p = 0;
    for (int i = 1; i <=50; i++)
    {
        p += i*i;
        std::cout << (3*p)/(2i+1) << " ";
    }
}

Cách 2:
Tổng các lập phương C(n) = 13 + 23 + … n3 = [n(n+1) / 2]2.
Tổng S(n) = 1 + 2 + … + n = n(n+1) / 2.
Suy ra, C(n) = [S(n)]2.

#include <iostream>
#include <cmath>
int main()
{
    int c = 0;
    for (int i = 1; i <= 50; i++)
    {
        c += i*i*i;
        std::cout << std::static_cast<int>(std::sqrt(c)+0.5) << " ";
    }
}

Cách 3:
Tổng các lập phương C(n) = 13 + 23 + … n3 = [n(n+1) / 2]2
Tổng các bình phương P(n) = 12 + 22 + … + n2 = n(n+1)(2n+1) / 6.
Tổng S(n) = 1 + 2 + … + n = n(n+1) / 2.

Lấy C(n) trừ đi P(n), sau đó đặt nhân tử chung:

  • C(n) - P(n) = (n-1)n(n+1)(3n+2) / 12.
  • C(n) - P(n) = S(n) . [(n-1)(3n+2) / 6).

Từ đó, S(n) = 6[C(n) - P(n)] / [(n-1)(3n+2)].

#include <iostream>
int main()
{
    std::cout << 1 << " ";

    int p = 1;
    int c = 1;
    for (int i = 2; i <= 50; i++)
    {
        p += i*i;
        c += i*i*i;
        std::cout << 6*(c-p) / ((i-1)*(3*i+2)) << " ";
    }
}

Đó là 3 cách “tào lao” của mình. :penguin:

2 Likes

A post was merged into an existing topic: Topic lưu trữ các post off-topic - version 3

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