题目:求 的值
一、做这个题我们其实可以直接一个for求解:
m,mm,mmm...我们很容易知道它们后一项与前一项的关系就是;
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);
}
二、其实也可以用高中学的数列来做
现已知,下面我们具体来求解
:
第一步转换:
;
第二步去括号求解K:
9K=m
解得K=
第三步,将K= 带入
式子就可变成:
第四步,求解:
不难发现数列{ } 以
为首项,q=10为公比的等比数列;
那么 从而得到:
得解!
接下来我们利用数学归纳法求解 :
①式子:
②式子:
我们知道q=10,于是得到③式子:
③-①:
;
所以:
用代码表示:
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补充结束
总结:方法二要求数据功底较深,用到高中数学归纳法求解求和公式;方法一只需要每次迭代当前 ,再求和。