- #define N 100 //计算N的阶乘,最多只能算到9999
- long a[8916]={1,0}, n , i , carry ,len;
- int main()
- {
- n=N;
- long tmp ;
- for ( len=1;n>1; n--)
- {
- for (c=0,i=0; i < len ; i++ )
- {
- tmp = a[i] * n + carry;
- a[i] = tmp % 10000; // 两个4位数相乘不会大于long型
- carry = tmp / 10000;
- }
- a[i] = carry ;
- if ( carry >0 ) len++;
- }
- //输出
- printf("%d",a[len-1]);
- for( len--;len>=0;len--)
- printf("%04d",a[len]);
- return 0;
- }
两数相乘:
- void mul(unsigned char a[],unsigned long k,int m,int n)
- {
- int i;
- unsigned long p;
- unsigned long c=0;
- for ( i=m+n-1; i>=n;i--)
- {
- p= a[i] * k +c;
- a[i]=(unsigned char)( p % 10);
- c= p / 10;
- }
- while (c>0)
- {
- a[i]=(unsigned char)( c % 10);
- i--;
- c /=10;
- }
- }
方法:把 乘数 乘以 被乘数 的一个数组元素,结果对 xx ( 10 1000 等) 取余 加上 进位数字 为当前位的结果,对 xx 取整为进位,乘数 和 下一个数组元素 相乘 加上 进位数字 得当前位的结果。
转自:http://blog.csdn.net/liangbch/article/details/3230428