当前位置: 代码迷 >> C语言 >> 运行结果不对请大家帮忙改一下程序
  详细解决方案

运行结果不对请大家帮忙改一下程序

热度:92   发布时间:2008-03-16 17:09:53.0
你这道题有两种考察方法,一种是直接算的方法,则可能是你的题目的意思,那么用下面的公式直接计算就可以了,一个线性时间的循环:
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]]
----------------解决方案--------------------------------------------------------
  相关解决方案