加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 04:02:32 所属栏目:大数据 来源:网络整理
导读:实数的大数乘法 ? ? ?就多一个定位小数点 ? 输出的时候不输出前导和后导零 ? ?所以大数乘法模版很重要 下面直接上代码 #includecstdio#includecmath#includecstring#includealgorithmusing namespace std;int point;//小数点的最终位置int zero(char *l)//控

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

下面直接上代码

#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]='';
    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,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]='';
    }
    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%dn",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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读