Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาผลรวมของอนุกรม 1+22+333+4444+... ไม่เกิน n เงื่อนไขใน C++


ในปัญหานี้ เราได้รับค่าจำนวนเต็ม N ภารกิจของเราคือ ค้นหาผลรวมของซีรีส์ 1 + 22 + 333 + 4444 + 55555... ไม่เกิน n เงื่อนไข .

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

Input : N = 4
Output : 4800

คำอธิบาย

1 + 22 + 333 + 4444 = 4800

แนวทางการแก้ปัญหา

วิธีง่ายๆ ในการแก้ปัญหาคือการหาเทอมทั่วไปของอนุกรมแล้วหาผลรวมจนถึง n เทอม และการคำนวณหาผลรวมโดยใช้สูตรจะลดเวลาลงเหลือ O(1)

ซีรีส์คือ

1 + 22 + 333 + 4444 + 55555...

ผลรวมของอนุกรมสามารถเขียนใหม่เป็น,

$\mathrm{Sum}\:=\:1^*(\frac{10^1-1}{9})\:+\:2^*(\frac{10^1-1}{9}) \:+\:3^*(\frac{10^1-1}{9})\dotsm$

รับ 1/9 ร่วมกัน ผลรวมจะกลายเป็น

$\mathrm{Sum}\:=\:1/9^*\lbrace(1^*10^1-1)\:+\:(2^*10^2-1)\:+\:(3 ^*10^3-1)\:+\:\dotsm(n^*10^1-n)\rbrace$

$\mathrm{Sum}\:=\:1/9^{*}\lbrace1^*10^1\:+\:2^*10^2\:+\:3^*10^3\:+ \:\dotsm+n^*10^n\:-\:(1+2+3+\dotsm\:n)\rbrace$

$\mathrm{Sum}\:=\:1/9^{*}\lbrace(1^*10^1\:+\:2^*10^2\:+\:3^*10^3\ :+\:\dotsm+n^*10^n)\:-\:1/2(n^*(n+1))\rbrace$

ระยะ (1*10 1 + 2*10 2 + 3*10 3 + ... + n * 10 ) สามารถแก้ไขได้โดยแยกความแตกต่างของสูตรทั่วไปสำหรับอนุกรม

1 + x + x 2 + x 3 + ... n * x n

ดังนั้น เงื่อนไข (1 * 10 1 + 2 * 10 2 + 3 * 10 3 + ... + n * 10 ) สามารถเขียนใหม่เป็น,

$\frac{n^*(10^{n+2})-(n+1)*(10^{n+1})+10}{81}$

ใส่กลับในสูตรผลรวม

$\mathrm{Sum}\:=\:1/9^*\lbrace(\frac{n^*(10^{n+2})-(n+1)*(10^{n+1}) +10)}{81}\:-\:1/2(n^*(n+1))\rbrace$

$\mathrm{Sum}\:=\:\frac{1}{1458}*\lbrace2^*(n*(10^{n+2})-(n+1)*(10^{n+1 })+10)-81^*n^*(n+1)\rbrace$

$\mathrm{Sum}\:=\:\frac{1}{1458}*\lbrace2^*(n*(10^{n+2})-(n+1)*(10^{n+1 })+10)-81^*n^*(n+1)\rbrace$

$\mathrm{Sum}\:=\:\frac{1}{1458}*\lbrace(n^*(2^*10^{n+1}-2^*10^{n+1})- 2^*10^{n+1})\:+\:20\:-\:81^*n^2-81n\rbrace$

$\mathrm{Sum}\:=\:\frac{1}{1458}*\lbrace10^{n+1*}(20n-2n-2)-81n^2-81n+20\rbrace$

$\mathrm{Sum}\:=\:\frac{1}{1458}*\lbrace10^{n+1*}(18n-2)-81n^2-81n+20\rbrace$

ตัวอย่าง

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

#include<iostream>
#include<math.h>
using namespace std;
int calcSumNTerms(int n) {
   return ( ( (18*n - 2)*(pow(10, n+1)) - 81*n*n - 81*n + 20 )/1458 );
}
int main() {
   int n = 5;
   cout<<"The sum of series upto n terms is "<<calcSumNTerms(n);
   return 0;
}

ผลลัพธ์

The sum of series upto n terms is 60355