大数乘法的C++实现总结

今天本来打算刷5道POJ上面的题,看来还是高估自己的能力了,六个小时抠出来了一道题,在此还是总结一下本题中用到的知识点:

首先,题目如下:

Description

Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a taxing experience for many computer systems. 

This problem requires that you write a program to compute the exact value of R n where R is a real number ( 0.0 < R < 99.999 ) and n is an integer such that 0 < n <= 25.

Input

The input will consist of a set of pairs of values for R and n. The R value will occupy columns 1 through 6, and the n value will be in columns 8 and 9.

Output

The output will consist of one line for each line of input giving the exact value of R^n. Leading zeros should be suppressed in the output. Insignificant trailing zeros must not be printed. Don't print the decimal point if the result is an integer.

Sample Input

95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12

Sample Output

548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201

Hint

If you don't know how to determine wheather encounted the end of input: 
s is a string and  n is an integer 

我的代码如下:

#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;

int main()
{
    char r[6];//该数组存放输入的字符串
    int iarray[5]={0};//该数组用来存放倒序的字符串数字
    char result[130];//该数组用来存放每一个次幂后的结果
    int n;//幂数
    int m;//记录小数的位数
    while(scanf("%s%d",r,&n)==2)
    {
        int number=0;//记录当前的幂数
        int iresult[140]={0};//记录中间结果
        for(int i=0;i<130;i++)
        {
            result[i]='0';
        }
        /*将存放最终结果的数组中赋值为初始的数的倒序*/
        for(int i=5,j=0;i>=0;i--)
        {
            if(r[i]!='.')
            {
                result[j]=r[i];
                iarray[j]=r[i]-'0';
                j++;
            }
            else{
                m=i;
            }
        }
        m=(5-m)*n;//小数的位数
        while(number<n-1)
        {
            int last=0;
            for(int i=0;i<140;i++)
            {
                iresult[i]=0;
            }
            for(int i=0;i<5;i++)
            {
                for(int j=0;j<130;j++)
                {
                    int temp=(iresult[j+i]+(last+iarray[i]*(result[j]-'0'))%10)/10;
                    iresult[j+i]=(iresult[j+i]+(last+iarray[i]*(result[j]-'0'))%10)%10;
                    last=temp+(last+iarray[i]*(result[j]-'0'))/10;
                }
            }
            for(int i=0;i<130;i++)
            {
                result[i]=iresult[i]+'0';
            }
            number++;
        }
        int q;
        for(int i=129;i>=0;i--)
        {
            if(result[i]!='0')
            {
                q=i;
                break;
            }
        }
        for(int i=q;i>=m;i--)
        {
            printf("%c",result[i]);
        }
        bool flag=false;
        for(int i=m-1;i>=0;i--)
        {
            if(result[i]!='0')
            {
                flag=true;
                break;
            }
        }
        if(flag)
        {
            printf("%c",'.');
            int k;
            for(int i=0;i<=m-1;i++)
            {
                if(result[i]!='0')
                {
                    k=i;
                    break;
                }

            }
            for(int i=m-1;i>=k;i--)
            {
                printf("%c",result[i]);
            }
        }
    printf("\n");
    }
    return 0;
}

首先,本题中这么大的数很明显是不能够使用pow函数的,因此第一个数和结果都按照字符串的形式进行输入,存储和输出;

第二点,模拟实现竖式乘法应该意识到将乘数与被乘数都逆序存储,然后运算,这样就可以从数组的开头一直往后运算;

第三点,这个我觉得我当时有点大脑短路了,小数位数是可以通过原来的数以及幂数确定的,但是我竟然去确定整数位数 ;

实现过程中,应该注意每一位的进位,其他的就没有什么了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值