POJ 1001 Exponentiation

本文探讨了在大数据运算中采用高效算法进行乘法运算的方法,并详细解释了如何对运算结果进行格式化输出,特别关注了特殊数据处理及输出样式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题主要是要对数据进行大数据运算算。

大数据进行乘法运算的时候,假设为a[MAX,b[MAX]两个数据相乘,那么所得的结果可以用如下的公式表示:

c[i+j] = a[i]*b[j];

c[i+j+1] += c[i+j]/10;

c[i+j] = c[i+j]%10;

这道题目后面比较麻烦的一点是对数据格式化输出,特别要注意的几个数据是9.0 0.0 其他的感觉还好。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
void  mypow(string r,int n);void powi(int *a,int n1,int n2,int pw);
int main ()
{
    string r ;
    int n = 0;
    int a[3]= {1,0,1};
    while ((cin >> r >> n))
    {
        mypow(r,n);
    }

}

void powi(int *a,int n1,int n2,int pw)
{
    int bgsz = n2*(n1+1);
    int *c = new int[bgsz];
    int *b = new int[bgsz];
    for (int i =n2*(n1+1); i >=0; i --) c[i] = 0;
    for (int i = n1; i >=0; i --) b[i]= a[i];
    for (int k =0; k < n2-1; k ++)
    {
        for (int i =0; i < n1+k*n1; i ++)
        {
            for (int j =0; j < n1; j ++)
            {
                c[i+j] += b[i]*a[j];
                c[i+j+1] += c[i+j]/10;
                c[i+j] = c[i+j]%10;
            }
        }
        for (int i =n2*(n1+1); i >=0; i --)
        {
            b[i] = c[i],c[i] =0;
        }
    }
    int flag = 0;
    int fstart = 0;
    for (int i =0; i < bgsz-1; i ++)
    {
        if (b[i] >0 && fstart <0) fstart = i;
        if (b[i]>0) flag = i;
    }
    if (pw<= flag)
        for (int i = flag; i >= pw; i--) cout << b[i];
    else{}
    if(pw > fstart)
    {
        cout << '.';
        for (int i = pw-1; i >= fstart; i --)
        {
            cout << b[i] ;
        }
    }
    else
    {
        if (pw+fstart)
            for (int i = pw; i>=0;i --) cout << b[i] ;
    }
    cout <<endl;

}
void mypow (string r,int n)
{
    string::reverse_iterator it = r.rbegin();
    int mout = 0;
    while (it != r.rend()&&*it == '0' )
    {
        mout ++;
        it ++;
    }
    r.erase(r.size()-mout,r.size());
    int pt = r.find('.');
    int pn = 0;
    if(pt >0)
        pn = (r.size()-pt-1)*n;
    if (pt >=0)
    {
        r.erase(pt,1);
    }
    int *a = new int[r.size()];
    int sz = r.size();
    for (int i =0; i < sz; i ++)
    {
        a[i] = r[sz-i-1]-48;
    }
    powi(a,sz,n,pn);
    delete a;
}















花了一下午写的,好久没有做题目了,脑袋秀逗了。代码很奇怪,编译之后,有时候能运行,有时候会出现死掉的情况,但是逻辑并没有什么问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值