uva 748 - Exponentiation 带小数点的大数乘法

来源:互联网 发布:mac队 编辑:程序博客网 时间:2024/05/09 22:50

实数的大数乘法      就多一个定位小数点   输出的时候不输出前导和后导零    所以大数乘法模版很重要

下面直接上代码

#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>using namespace std;int point;//小数点的最终位置int  zero(char *l)//控制后导零不输出{    int i;    for(i = 0; l[i]=='0' ;i++);    return i;}void print(char *p, int p_len){    char str[200],str_len = 0;    for(int i = 0;i < p_len; i++)    {        if(i == point)str[str_len++] = '.';//补上小数点        str[str_len++] = p[i];    }    int i = str_len-1;    for(i = str_len-1; str[i] == '0'; i--);//加上这条输出时去掉前导零    for( ;i >= zero(str); i--)        printf("%c",str[i]);    printf("\n");}int  re_order(char *p, int p_len, char *q)//逆序存储p到q中{    int q_len = 0;    for(int i = p_len-1; i >= 0; i--)    {        if(p[i] == '.')continue;//去掉小数点        q[q_len++]=p[i];    }    q[q_len]='\0';    return q_len;}void  multi(char *p, int  p_len, int N){    char str[200];    int  num[200],i, j, t;    int str_len = p_len,sum;    strcpy(str,p);    for(t = 0; t < N-1; t++)//N个数相乘    {        sum = 0;        memset(num,0,sizeof(num));//这一定要初始化为零  要不容易Wrong的        for(i = 0; i < p_len; i++)            for(j = 0; j < str_len; j++)                num[i+j] += (p[i]-'0')*(str[j]-'0');        for(i = 0; i < p_len+str_len; i++)        {            sum += num[i];            str[i] = sum%10+'0';            sum /= 10;        }        str_len = i;        str[i]='\0';    }    print(str,str_len);}int main(){    #ifdef LOCAL    freopen("in1.txt","r",stdin);    #endif // LOCAL    char str[10],s[10];    int N;    while(scanf("%s%d\n",str,&N)!=EOF)    {        int str_len = strlen(str);        for(int i = 0; i < str_len; i++)            if(str[i] == '.'){point  = (str_len -i -1)*N;break;}        int s_len = re_order(str, str_len, s);        multi(s,s_len,N);    }    return 0;}