ในปัญหานี้ เราได้รับตัวเลข n งานของเราคือสร้างโปรแกรมหาผลรวมของอนุกรม 1 + (1+3) + (1+3+5) + (1+3+5+7) + …… + (1+3+ 5+7+…+(2n-1)).
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล: n =5
ผลลัพธ์: 55
ตามคำถาม สมมติว่าผู้ใช้ให้ตัวเลข 'n' แก่เรา และเราต้องเพิ่มชุดข้อมูล 1 + (1+3) + (1+3+5) + (1+3+5+7) + …… + (1+3+5+7+…+(2n-1)).
มาทำความเข้าใจความหมายของซีรีส์นี้กันก่อนดีกว่า
เราหา n=1 แล้วอนุกรมกลายเป็น 1
เราใช้ n=2 แล้วอนุกรมจะกลายเป็น 1+ (1+3) เพราะค่าของเทอมสุดท้าย 2n-1 สามารถคำนวณได้เป็น 2 คูณ 2 เกิน 1 ซึ่งก็คือ 3
ค่าของ n | 2n-1 | ซีรีส์กลายเป็น |
1 | 1 | 1 |
2 | 3 | 1+ (1+3) |
3 | 5 | 1+ (1+3) + (1+3+5) |
4 | 7 | 1+ (1+3) + (1+3+5) + (1+3+5+7) |
มาถึงการแก้ปัญหาก็สามารถแก้ไขได้สองวิธี หนึ่งจะเป็นทางคณิตศาสตร์ที่สามารถได้รับนิพจน์ของผลรวมทั้งหมดและด้วยเหตุนี้จึงไม่จำเป็นต้องวนซ้ำ อีกอันจะใช้สองลูปในโค้ด
เข้าใกล้โดยตรงโดยใช้ลูป
ดังจะเห็นได้ว่าระยะของซีรีส์ 1 + (1+3) + (1+3+5) + (1+3+5+7) + …… + (1+3+5+7+… +(2n-1)) เป็นอนุกรมนั่นเอง ดังนั้นเราจะใช้การวนซ้ำซ้อน วงนอกจะคำนวณเทอมที่สอง ในขณะที่วงในจะใช้ในการคำนวณคำนั้นเอง
ตัวอย่าง
#include<stdio.h> int calcSum(int n){ int sum = 0; for (int i = 1; i <= n; i++) { // the first value of the term is always 1 int value = 1; for (int j = 1; j <= i; j++) { sum += value; // next term value += 2; } } return sum; } int main(){ int n = 35; printf("The sum of the series upto %d is %d ", n , calcSum(n)); }
ผลลัพธ์
The sum of the series upto 35 is 14910
การทำงานของโปรแกรม:
- ผู้ใช้ป้อนค่าของ n. สมมุติว่า 2.
- ตัวแปรชื่อ “sum” ถูกประกาศด้วยค่าเริ่มต้นเป็น 0
- เมื่อ i=1 สำหรับเงื่อนไข i<=n เป็นจริงและด้วยเหตุนี้การวนซ้ำจะทำงาน
- ค่าของตัวแปร “ft” คือ 1.
- ค่าแรกของ j คือ 1 เงื่อนไขเป็นจริงเนื่องจากค่าของ j เท่ากับค่าของ i ซึ่งก็คือ 1 ดังนั้น j loop จะทำงาน
- ค่าของ ft จะถูกบวกเข้ากับผลรวม ดังนั้นผลรวมจึงกลายเป็น 0+1 เท่ากับ 1
- ค่าของ ft ถูกแก้ไขและเพิ่มขึ้น 2 ดังนั้นค่าใหม่ของมันคือ 1+2 =3
- ค่าของ j เพิ่มขึ้น 1 และกลายเป็น 2
- แต่ตอนนี้เงื่อนไขของ inner for loop นั้นเป็นเท็จ ดังที่ j>i ตอนนี้ ดังนั้นจึงออกจากลูป j
- ตอนนี้ค่าของ i เพิ่มขึ้น 1 และกลายเป็น 2 ดังนั้น i=2 และเงื่อนไขเป็นจริง i<=n จึงเข้าสู่ลูป
- ค่าของตัวแปร “ft” ถูกกำหนดเป็น 1 อีกครั้ง
- เมื่อค่า j เป็น 1 การวนซ้ำจะทำงานเป็น j
- ค่าของ ft จะถูกบวกเข้ากับผลรวม มูลค่าของผลรวมเป็น 1 แล้ว ดังนั้นค่าใหม่ของผลรวมคือ 1+1 =2
- ค่าของ ft ถูกแก้ไขและเพิ่มขึ้น 2 ดังนั้นค่าใหม่ของ ft จะกลายเป็น 1+2 =3
- ค่าของ j เพิ่มขึ้น 1 และกลายเป็น 2 เงื่อนไข for loop เป็นจริงเมื่อ j เท่ากับ i
- ค่าของ ft จะถูกบวกเข้ากับผลรวม มูลค่าของผลรวมเป็น 2 แล้ว ดังนั้นค่าใหม่ของผลรวมคือ 2+3 =5
- ค่าของ ft ถูกแก้ไขและเพิ่มขึ้น 2 ดังนั้นค่าใหม่ของ ft จะกลายเป็น 3+2 =5
- วนซ้ำอยู่
- ตอนนี้ค่าของ i เพิ่มขึ้น 1 และกลายเป็น 3 ดังนั้น i=3 และเงื่อนไขเป็นเท็จ i<=n จึงออกจากลูป
- พิมพ์ข้อความและมูลค่ารวมบนหน้าจอ
วิธีแก้ปัญหาทางคณิตศาสตร์:
การค้นหาวิธีแก้ปัญหาทางคณิตศาสตร์สำหรับคำถามแล้วเขียนโค้ดจะทำให้โค้ดของเรามีความเรียบง่ายขึ้นมาก
ให้เทอมทั่วไป Tn ของซีรีส์
ก่อนจะคืบหน้าเราควรรู้ว่าชุดที่ 1+3+5+7+9…..(2n-1) จะมีผลรวมเป็น n 2, และซีรีส์
1 2 +2 2 +3 2 +4 2 ….n 2 จะมีผลรวมของ i 2 =
โปรแกรมแสดงการทำงานของโค้ดของเรา
ตัวอย่าง
#include<stdio.h> int calcSum(int n){ // required sum return (( (n) * (n + 1) * (2*n + 1 ) )/6 ) ; } int main(){ int n = 35; printf("The sum of the series upto %d is %d ", n , calcSum(n)); }
ผลลัพธ์
The sum of the series upto 35 is 14910
การทำงานของโค้ดด้านบน:
ตัวอย่างเช่น สมมติว่าผู้ใช้ป้อนค่าของ n เป็น 2 จากนั้นค่าของ 2n-1 คือ 3 และชุดข้อมูลจะกลายเป็น 1+ (1+3)
แต่ขอให้เราเข้าใจและรับผลรวมผ่านรหัส
- เรียกฟังก์ชัน sum() ด้วยค่า 2
- ฟังก์ชันจะคำนวณค่าเป็น 5 และคืนค่ากลับไปเป็นฟังก์ชันหลัก
- ข้อความพร้อมคำตอบจะพิมพ์บนหน้าจอ