POJ 1001

来源:互联网 发布:阿里云服务器遭到攻击 编辑:程序博客网 时间:2024/05/16 09:57

请注意,这道题并不像 看上去那么容易,至少我觉得,还是有点复杂的,毕竟大整数的计算还是有很多细节要注意。

问题:计算一个在 0 ~ 100之内实数的n次方 (0<n<=25)


拓展一下,大整数的计算有几点要注意:

1.数据接收,存储(数组或者字符串)

2.计算结果位数

3.进位处理,借位处理

4.商、余数求法


这道题注意点:

1.小数点的处理,以及反序

2.进行n次乘法

3.输出格式要注意


#include <iostream>#include <string.h>using namespace std;int main(){    char d[10];    int n;    while(cin>>d>>n){        int a[150] = {0},b[150] = {0},c[150] = {0};        int temp,flag,i,j,k,digit,s;        int lend,lena,lenb,lenc,len;        lend = strlen(d) - 1;        for(i=0;d[i];i++)            if(d[i] == '.') break;  //求出小数点所在位数        digit = lend - i;        for(j=i;d[j];j++)            d[j] = d[j+1];   //小数点后面的数字前移        lend = lend - 1;        for(i=0;i<=lend/2;i++){            temp = d[i];            d[i] = d[lend-i];            d[lend-i] = temp;        }        for(i=0;d[i];i++)            a[i] = d[i] - 48;        lena = lend;        for(i=0;i<=lena;i++)            b[i] = a[i];        lenb = lena;        for(i=1;i<=n-1;i++){            for(j=0;j<=lenb;j++)                for(k=0;k<=lena;k++){                    c[j+k] += a[k]*b[j];                    c[k+j+1] += c[j+k]/10;                    c[j+k] %= 10;                }            k--;            j--;            if(c[k+j+1]!=0)                lenc = j+k+1;            else                lenc = j+k;            for(j=0;j<=lenc;j++)                b[j] = c[j];            lenb = lenc;            memset(c,0,sizeof(c));        }        digit = n * digit;        len = lenb + 1 -digit;        flag = 0;        for(i=lenb-len;i>=0;i--)            if(b[i]!=0){                flag = 1;                break;            }        if(flag == 0){            for(i=lenb;i>=lenb-len+1;i--)                cout<<b[i];            cout<<endl;            continue;        }        if(len == 1 && b[lenb] == 0)            cout<<".";        else{            for(i=lenb;i>=lenb-len+1;i--)                cout<<b[i];            cout<<".";        }        for(i=0;i<=lenb-len;i++)            if(b[i]!=0){                temp = i;                break;            }        for(i=lenb-len;i>=temp;i--)            cout<<b[i];        cout<<endl;    }    return 0;}


0 0
原创粉丝点击