你这道题有两种考察方法,一种是直接算的方法,则可能是你的题目的意思,那么用下面的公式直接计算就可以了,一个线性时间的循环:
result= a * sum( (n-i) * (10^i) ); i=0,1, ... , n-1;
代码如下:
另一种考察方法则是大数,例如a和n给的都很大,这时候直接算整数会溢出。这时候用这样一个大数乘法就行了,这样结果更简单:用这样一个数组:
int a[100]
里面的存储元素是这样的:从0开始,a[0]表示位数,a[1]表示个位,a[2]表示十位,。。。
则a中的元素为:
n, n, n-1,n-2,...,3,2,1,0,0,0,.....,0
然后从个位循环到最高位,每一位都乘以a。然后最后从低位到高位做一次归一化运算(注意归一话时候可能需要相应调整位数a[0]):
a[i+1]+=a[i]/10;
a[i]=a[i]%10;
最后从高位到地位输出a中的元素即可。大数乘以一个小整数的算法比较简单,我就不写代码了,代码可以参考数据结构相关的书籍,有很多。
[[it] 本帖最后由 hoodlum1980 于 2008-3-16 19:22 编辑 [/it]]
result= a * sum( (n-i) * (10^i) ); i=0,1, ... , n-1;
代码如下:
程序代码:
#include <stdio.h> void main() { unsigned long sum=0,base=1; int a,n,i; printf("input a=?, n=? [a,n]:\n"); scanf("%d,%d",&a,&n); for(i=0;i<n;i++,base*=10) sum+=(n-i)*base; sum=sum*a; printf("sum=%ld\n",sum); }
另一种考察方法则是大数,例如a和n给的都很大,这时候直接算整数会溢出。这时候用这样一个大数乘法就行了,这样结果更简单:用这样一个数组:
int a[100]
里面的存储元素是这样的:从0开始,a[0]表示位数,a[1]表示个位,a[2]表示十位,。。。
则a中的元素为:
n, n, n-1,n-2,...,3,2,1,0,0,0,.....,0
然后从个位循环到最高位,每一位都乘以a。然后最后从低位到高位做一次归一化运算(注意归一话时候可能需要相应调整位数a[0]):
a[i+1]+=a[i]/10;
a[i]=a[i]%10;
最后从高位到地位输出a中的元素即可。大数乘以一个小整数的算法比较简单,我就不写代码了,代码可以参考数据结构相关的书籍,有很多。
[[it] 本帖最后由 hoodlum1980 于 2008-3-16 19:22 编辑 [/it]]