HDOJ 1063 大数乘法

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1063

输入数据中可能有小数点,也可能没有。题目的讨论板里面有人给出了比较特殊的测试数据。

代码写的比较乱…

#include <iostream>
using namespace std;

const int LEN = 130;
int ans[LEN];

void doMultiply(int base)
{
    for (int i = 0;i < LEN;i ++)
        ans[i] *= base;
    for (int i = 0;i < LEN;i ++)
    {
        ans[i + 1] += ans[i] / 10;
        ans[i] %= 10;
    }
}

void Output(int floatNum, int exp, int isInt)
{
    int isAllZero = 1;
    for (int i = 0;i < LEN;i ++)
        if (ans[i] != 0)
        {
            isAllZero = 0;
            break;
        }
    if (isAllZero)
    {
        printf("0\n");
        return;
    }
    //计算尾部的连续0的个数
    int tailZeroLen = 0;
    for (int i = 0;i < LEN;i ++)
    {
        if (ans[i] != 0)
            break;
        tailZeroLen ++;
    }
    int totalFloatNum = floatNum * exp;
    int effectiveNumLen = 0;
    for (int i = LEN - 1;i >= 0 ;i --)
    {
        if (ans[i] != 0)
        {
            effectiveNumLen = i + 1;
            break;
        }
    }
    //是纯小数
    if (totalFloatNum >= effectiveNumLen)
    {
        printf(".");
        for (int i = 0;i < (totalFloatNum - effectiveNumLen);i ++)
            printf("0");
        for (int i = (effectiveNumLen - 1);i >= tailZeroLen;i --)
            printf("%d",ans[i]);
        printf("\n");
    }
    else
    {
        for (int i = (effectiveNumLen - 1);i >= totalFloatNum;i --)
            printf("%d",ans[i]);
        //如果是整数,不用再输出了
        if (isInt)
        {
            printf("\n");
            return;
        }
        printf(".");
        for (int i = totalFloatNum - 1;i >= tailZeroLen;i --)
            printf("%d",ans[i]);
        printf("\n");
    }
}

int main ()
{
    char input[10];
    int exp;//指数
    while (scanf("%[0-9.]%d\n",input,&exp) != -1)
    {
        //指数为0,结果为1
        if (exp == 0)
        {
            printf("1\n");
            continue;
        }
        memset(ans, 0, sizeof(ans));
        int isFloatPointFound = 0, isInt = 1, floatNum = 0, pos = 0;
        //判断输入的数是否是整数
        //两种情况
        //1.没有小数点 2.小数点后面都是0
        for (int i = 0;i < strlen(input);i ++)
            if (input[i] == '.')
            {
                isFloatPointFound = 1;
                break;
            }
        //如果没有小数点,则肯定是整数
        if (isFloatPointFound == 0)
            isInt = 1;
        else
        {
            //如果输入数据有小数点,但是从最低位到小数点前一位都是0,则是整数
            for (int i = strlen(input) - 1;i >= 0;i --)
            {        
                if (input[i] == '.')
                    break;
                if (input[i] != '0')
                    isInt = 0;
            }
        }

        //反向存储输入数据

        //如果输入数据是整数
        if (isInt == 1)
        {
            floatNum = 0;
            //有小数点,从小数点的高一位开始取数
            if (isFloatPointFound)
            {
                int i;
                for (i = strlen(input) - 1;i >= 0;i --)
                    if (input[i] == '.')
                        break;
                i --;
                for (;i >= 0;i --)
                {
                    ans[pos] = input[i] - '0';
                    pos ++;
                }
            }
            //没有小数点,从最低位开始取
            else
            {
                for (int i = strlen(input) - 1;i >= 0;i --)
                {
                    ans[pos] = input[i] - '0';
                    pos ++;
                }
            }
        }
        //输入数据是小数,肯定包含了小数点
        else
        {
            isFloatPointFound = 0;
            for (int i = strlen(input) - 1;i >= 0;i --)
            {
                if (input[i] == '.')
                    isFloatPointFound = 1;
                else
                {
                    ans[pos] = input[i] - '0';
                    pos ++;
                }
                if (isFloatPointFound == 0)    
                    floatNum ++;
            }
        }
        //将读入的数(浮点数或整数)统一转成一个整数base
        int base = 0, magnitude = 1;
        for (int i = 0;i < pos;i ++)
        {
            base += magnitude * ans[i];
            magnitude *= 10;
        }
        for (int i = 0;i < (exp - 1);i ++)
        {
            //乘以exp - 1次
            doMultiply(base);
        }
        Output(floatNum, exp, isInt);
    }
    return 0;
}
posted @ 2012-08-23 22:22  peaceful  阅读(243)  评论(0)    收藏  举报