1000的阶乘

用字符串存储大数

#include <iostream>  
using namespace std;  

int multi(char a, char b)  
{  
    return (a - '0') * (b - '0'); 
}  

void strMulti(char *a, char *b, char *c) 
{  
    // 最好对a,b和c的合法性进行判断  

    int lenA = strlen(a);  
    int lenB = strlen(b);  
    int maxLen = lenA + lenB;  
    int *p = new int[maxLen];  
    memset(p, 0, maxLen * sizeof(int)); // 千万要注意不要写成memset(p, 0, maxLen);  

    int i, j;  
    for(j = lenB - 1; j >= 0; j--)  
    {  
        for(i = lenA - 1; i >= 0; i--)  
        {  
            p[j + i + 1] += multi(b[j], a[i]);  
        }  
    }  

    // 处理进位操作  
    for(i = maxLen - 1; i >= 1; i--)  
    {  
        p[i - 1] += p[i] / 10;  
        p[i] = p[i] % 10;  
    }  

    int index=0;
    if(p[0]==0) index++;
    for(index;index<maxLen;index++){
        *c++=p[index]+'0';
    }
    *c='\0';   
}  

void main(){
    int num;
    cin>>num;
    char str[5000];
    *str='1';
    *(str+1)='\0';
    char tmp[50];
    for(int i=1;i<=num;i++){
        itoa(i,tmp,10);
        strMulti(str,tmp,str);
    }
    cout<<str<<endl;    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值