求Sn=m+mm+mmm+...+mm..mmm(有n个m)的值

题目:求S_{n}=m+mm+mmm+...+mm...mmm 的值 

一、做这个题我们其实可以直接一个for求解:

m,mm,mmm...我们很容易知道它们后一项与前一项的关系就是a_{n}=m+10*a_{n-1}

    public static void Sum(int m,int n)
        {
            long sum = 0L;
            long curAn = 0;
            for (int i = 0; i < n; i++)
            {
                curAn = m+ 10* curAn;// An=m+10*A(n-1)
                sum+= curAn;// 求和
            }
            Console.WriteLine(sum);
        }

二、其实也可以用高中学的数列来做

现已知a_{n}=m+10*a_{n-1},下面我们具体来求解a_{n}

第一步转换:

a_{n}+K=10(a_{n-1}+K)

第二步去括号求解K:

a_{n}+K=10*a_{n-1}+10K

a_{n}=10*a_{n-1}+9K

9K=m

解得K=\frac{m}{9} 

第三步,将K=\frac{m}{9} 带入 a_{n}+K=10(a_{n-1}+K)  式子就可变成:

a_{n}+\frac{m}{9}=10(a_{n-1}+\frac{m}{9})  

第四步,求解a_{n}

\frac{a_{n}+\frac{m}{9}}{(a_{n-1}+\frac{m}{9})}=10 

不难发现数列{{a_{n}+\frac{m}{9}} } 以m+\frac{m}{9} 为首项,q=10为公比的等比数列;

那么b_{n}=a_{n}+\frac{m}{9}=b_{1}*q^{n-1}=(m+\frac{m}{9})*10^{n-1} 从而得到:

a_{n}=(m+\frac{m}{9})*10^{n-1}-\frac{m}{9}   得解!

接下来我们利用数学归纳法求解 S_{n}

①式子:

S_{n}=a_{1}+a_{2}+a_{3}+...+a_{n}

 =(m+\frac{m}{9})*10^{0}-\frac{m}{9}+(m+\frac{m}{9})*10^{1}-\frac{m}{9}+(m+\frac{m}{9})*10^{2}-\frac{m}{9}+(m+\frac{m}{9})*10^{3}-\frac{m}{9}+...+(m+\frac{m}{9})*10^{n}-\frac{m}{9}

=(m+\frac{m}{9})*(10^{0}+10^{1}+10^{2}+10^{3}+...+10^{n-1})-n*\frac{m}{9} 

②式子:

q*S_{n}=q*a_{1}+q*a_{2}+q*a_{3}+...+q*a_{n}

            =q*(m+\frac{m}{9})*(10^{0}+10^{1}+10^{2}+10^{3}+...+10^{n-1})-q*n*\frac{m}{9}

我们知道q=10,于是得到③式子:

10*S_{n}=10*a_{1}+10*a_{2}+10*a_{3}+...+10*a_{n}

               =10*(m+\frac{m}{9})*(10^{0}+10^{1}+10^{2}+10^{3}+...+10^{n})-10*n*\frac{m}{9} 

               =(m+\frac{m}{9})*(10^{1}+10^{2}+10^{3}+10^{4}+...+10^{n-1}+10^{n})-10*n*\frac{m}{9} 

③-①:

9*S_{n}=(m+\frac{m}{9})*(10^{n}-10^{0})-n*m ;

所以:

S_{n}=\frac{1}{9}*(m+\frac{m}{9})*(10^{n}-1)-\frac{n*m}{9}

      =\frac{1}{9}*m*[\frac{10}{9}*(10^{n}-1)-n] 

用代码表示:

    public static void Sum2(int m, int n)
        {
            double result = 10 / (double)81 * (Math.Pow(10, n) - 1) * m - n / (double)9;
            long sum = (long)result;
            Console.WriteLine(sum);
        }

2023.12.13 补充:

sum2方法调整,原因:减少数字n小时的溢出以及精度误差。

       public static void Sum2(int m, int n)
        {
            double result = (Math.Pow(10, n) - 1) / 9 * 10 - n;
            result = result / 9 * m;
            long sum = (long)result;
            Console.WriteLine(sum);
        }

优化:利用 System.Numerics 库的 BigInteger计算

     public static void Sum3(int m, int n)
        {
            BigInteger numerator = BigInteger.Multiply( BigInteger.Divide( BigInteger.Pow(10, n) - 1,9),10)-n;
            numerator= numerator / 9 * m;

            Console.WriteLine(numerator);
        }

当然 利用 System.Numerics 库的 BigInteger计算也可以把Sum方法也修改一下,可以计算更大的n与m,如下:

     public static void Sum(int m, int n)
        {
            BigInteger sum = 0L;
            BigInteger curAn = 0;
            for (int i = 0; i < n; i++)
            {
                curAn = m + 10 * curAn;// An=m+10*A(n-1)
                sum += curAn;// 求和
            }
            Console.WriteLine(sum);
        }

 2023.12.13补充结束

总结:方法二要求数据功底较深,用到高中数学归纳法求解求和公式;方法一只需要每次迭代当前a_{n} ,再求和。

你可能感兴趣的:(算法)