Precision power (高精度幂运算)(相乘的变体)

来源:互联网 发布:数据库怎么设计 编辑:程序博客网 时间:2024/04/29 08:42

 

 

POJ 1001  http://poj.org/problem?id=1001

//注意存储方式是从后往前存储的 也就是逆序存储的#include<iostream>using namespace std;char str[10];int n, dot;int res[200], a[200], b[200];//a记录的是相乘之后的数int len, lena, lenb;//lena、lenb分别记录a,b的长度void mul(){int i,j;memset(res, 0, sizeof(res));for(i=1; i<=lena; i++)  {for(j=1; j<=lenb; j++){res[i+j-1]=res[i+j-1]+a[i]*b[j];if (res[i+j-1]>9){res[i+j] =res[i+j]+res[i+j-1]/10;res[i+j-1]%=10;}}}if (res[lena+lenb-1]>9) //最高位的处理 {res[lena+lenb] = res[lena+lenb-1] / 10;    //res[lena+lenb] + res[lena+lenb-1] = res[lena+lenb-1] % 10;}lena = lena + lenb;for (i=1; i<=lena; i++)   //将结果值重新放在a里a[i] = res[i];}int main(){int i,j,up,down;while (scanf("%s %d", str, &n)!=EOF){dot = -1;for (i=5, j=1; i>=0; i--){if (str[i]!='.'){a[j]=b[j]=str[i]-'0';    j++;}elsedot = i;}if(dot==-1)                 //如果没有小数,就有六位;否则,是五位lena=lenb=6;elselena=lenb=5;for (i=1; i<n; i++)mul();if (dot==-1)       //如果没有小数直接输出{for (i=lena; i>=1; i--)printf("%d", a[i]);printf("\n");}else//在此处处理小数的时候,对于那些在不计小数相乘后的结果前后有出现零的先处理零,将前后的零全部去掉,//然后再查看小数位置,调整输出的起始地址{dot=5-dot;//第几位是小数dot=dot*n;for (i=1; i<=lena; i++)//消除小数后的没有实际含义的零{if (a[i]!=0){down=i;//记录小数后面第一个不为零的位置break;}}for (j=lena; j>=1; j--)//消除正式前的没有实际含义的零{if (a[j]!=0){up = j;//记录整数后面第一个不为零的位置break;}}i=up;if (up<dot)//整数前需补零i = dot;j=down;if (j>dot)  //应对那些10.000这样j = dot + 1;for (; i>=j; i--){if (i==dot)printf(".");printf("%d", a[i]);}printf("\n");}}return 0;}


 

0 0
原创粉丝点击