Exponentiation POJ-1001

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

  1 //10000000   100000
  2
  3 #include<iostream>
  4 #include<cstring>
  5 using namespace std;
  6
  7 char ts[7],tts[7];                            //用于处理输入,删去点,签到0,点后0,统计小数点后数的个数保存至origu
  8 short orig[7],ans[2500],t_ans[2500];        // t_ans存乘法运算的中间过程
  9 int b,u,origu,BITS,origBITS;
 10
 11 void my_pow(int x){
 12     if(x==1)
 13         return ;
 14
 15
 16     my_pow(x/2);
 17     //接下来ans*ans
 18     memset(t_ans,0,sizeof(t_ans));
 19     for(int i=BITS-1;i>=0;i--){       //模拟乘法
 20         int tpos=BITS-1-i;            //tpos即 这次乘的结果存在t_ans哪一位 ,注意ans是高位在前, t_ans是高位在后的
 21         for(int j=BITS-1;j>=0;j--){
 22             t_ans[tpos]+=ans[j]*ans[i];
 23             if(t_ans[tpos]>9){            //进位,   这个进位应该进一位就可以了,没有必要再向前推了,因为某一位算出来的最大也到不了100(?)
 24                 t_ans[tpos+1]+=t_ans[tpos]/10;
 25                 t_ans[tpos]%=10;
 26             }
 27             tpos++;
 28         }
 29     }
 30
 31     int _BITS=0;   //   统计 2500-t_ans的位数
 32     for(int i=2500-1;i>=0;i--)
 33         if(t_ans[i]==0)
 34             _BITS++;
 35         else
 36             break;
 37     BITS=2500-_BITS;    //更新BITS
 38
 39     for(int i=BITS-1,j=0;i>=0;i--)            //高位在前存到ans里去
 40         ans[j++]=t_ans[i];
 41     u*=2;            //因为是自己×自己    所以小数点后数字个数增加一倍
 42
 43
 44     if(x%2){                        //如果^b的b是奇数,还得再×一下初始的数即orig
 45         //ans*orig
 46
 47         memset(t_ans,0,sizeof(t_ans));
 48
 49         for(int i=origBITS-1;i>=0;i--){
 50             int tpos=origBITS-1-i;
 51             for(int j=BITS-1;j>=0;j--){
 52                 t_ans[tpos]+=ans[j]*orig[i];
 53                 if(t_ans[tpos]>9){
 54                     t_ans[tpos+1]+=t_ans[tpos]/10;
 55                     t_ans[tpos]%=10;
 56                 }
 57                 tpos++;
 58             }
 59         }
 60
 61         _BITS=0;
 62         for(int i=2500-1;i>=0;i--)
 63             if(t_ans[i]==0)
 64                 _BITS++;
 65             else
 66                 break;
 67         BITS=2500-_BITS;
 68
 69         for(int i=BITS-1,j=0;i>=0;i--)
 70             ans[j++]=t_ans[i];
 71         u=u+origu;
 72     }
 73
 74 }
 75
 76 void _print(){
 77     if(u<BITS){
 78         int _del=0;
 79         for(int i=BITS-1;i>=BITS-u;i--){
 80             if(ans[i]==0)
 81                 _del++;
 82             else
 83                 break;
 84         }
 85         BITS-=_del;
 86         u-=_del;
 87         for(int i=0;i<BITS-u;i++)
 88             printf("%d",ans[i]);
 89         if(u){
 90             printf(".");
 91             for(int i=BITS-u;i<BITS;i++)
 92                 printf("%d",ans[i]);
 93         }
 94         printf("\n");
 95     }
 96     else{
 97         int _del=0;
 98         for(int i=BITS-1;i>=0;i--){
 99             if(ans[i]==0)
100                 _del++;
101             else
102                 break;
103         }
104         BITS-=_del;
105         u-=_del;
106         printf(".");
107         for(int i=0;i<u-BITS;i++)
108             printf("0");
109         for(int i=0;i<BITS;i++)
110             printf("%d",ans[i]);
111         printf("\n");
112     }
113 }
114
115 int main(){
116     while(scanf("%s%d",ts,&b)==2){
117
118         u=0;
119
120         bool fg=1;                                                    //删点后0
121         for(int i=5;i>=0;i--)
122             if(fg&&ts[i]==‘0‘)
123                 ts[i]=‘\0‘;
124             else
125                 fg=0;
126
127
128         for(int i=strlen(ts)-1;i>=0;i--)            //删点,统计点后数个数u  origu
129             if(ts[i]!=‘.‘)
130                 u++;
131             else
132                 break;
133         origu=u;
134
135
136         for(int i=strlen(ts)-u-1;ts[i]!=‘\0‘;i++)            // 删点,点后前移
137             ts[i]=ts[i+1];
138
139
140         memset(tts,0,sizeof(tts));                    //删前导0
141         int pos=0;
142         fg=1;
143         for(int i=0;ts[i]!=‘\0‘;i++)
144             if(ts[i]==‘0‘&&fg)
145                 pos++;
146             else
147                 fg=0;
148         for(int i=pos,j=0;ts[i]!=‘\0‘;i++)
149             tts[j++]=ts[i];
150
151         BITS=origBITS=0;
152         memset(ans,-1,sizeof(ans));
153         memset(orig,-1,sizeof(orig));
154         for(int i=0;tts[i]!=‘\0‘;i++){                //转到int数组
155             ans[i]=orig[i]=(int)(tts[i]-‘0‘);
156             origBITS++;BITS++;
157         }
158
159         my_pow(b);                    //快速幂
160         _print();                    //输出
161     }
162     return 0;
163 } 

但是杭电这道同样的过不了,据说杭电会有00000.这样的测试数据?但是0能记成这种记法吗?还有人家明明说了R>0.0   ,   n>0为什么还非得找R=0N=0的特例啊,不管了,反正俺poj过了

原文地址:https://www.cnblogs.com/spzeno/p/10661484.html

时间: 2024-10-23 08:50:31

Exponentiation POJ-1001的相关文章

POJ 1001 Exponentiation(JAVA,BigDecimal-&gt;String)

题目 计算实数a的n次方,具体输出格式看案例 import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); BigDecimal a = BigDecimal.ONE; BigDecimal ans = BigDecimal.ONE; int n; while(in.hasNextBi

POJ 1001 Exponentiation 无限大数的指数乘法 题解

POJ做的非常好,本题就是要求一个无限位大的指数乘法结果. 要求基础:无限大数位相乘 额外要求:处理特殊情况的能力 -- 关键是考这个能力了. 所以本题的用例特别重要,再聪明的人也会疏忽某些用例的. 本题对程序健壮性的考查到达了变态级别了. 某人贴出的測试用例数据地址: http://poj.org/showmessage?message_id=76017 有了这些用例,几下调试就过了. 我关键漏了的用例: 000.10  1 000000  1 000.00  1 .00000  0 0000

POJ 1001 Exponentiation(大数幂,还是Java大发好!需调用多个方法)

Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 156303   Accepted: 38063 Description Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the n

POJ 1001 Exponentiation

Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 171995   Accepted: 41641 Description Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the n

POJ 1001 Exponentiation 求高精度幂

Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 147507   Accepted: 36006 Description Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the n

POJ 1001 Exponentiation 模拟小数幂

模拟小数幂 小数点位 pos 非零末位 e 长度 len 只有三种情况 pos > len pos < e e < pos < len 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int a[500], b[500], c[500]; 5 void Cal() 6 { 7 memset(c, 0, sizeof(c)); 8 for(int i = 0; i <

solution for POJ 1001

http://poj.org/problem?id=1001 POJ的前几道题理解起来很简单,算法也不复杂,只是需要花很长的时间去调试.1001本质上就是一个大数运算的问题,大数乘法的问题可以采用分治法,具体参考这篇文章:http://blog.csdn.net/tjsinor2008/article/details/5625849.代码如下: 1 #include<stdio.h> 2 #include<memory.h> 3 4 unsigned char a[200],b[2

POJ 1001 高精度

链接: http://poj.org/problem?id=1001 题意: 计算小数的幂,高精度 题解: 第一次用java ac,^-^ 代码: 1 import java.util.*; 2 import java.math.*; 3 4 public class Main { 5 public static void main(String args[]) { 6 Scanner cin = new Scanner(System.in); 7 while (cin.hasNext()) {

POJ 1001 解题报告 高精度大整数乘法模版

题目是POJ1001 Exponentiation  虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于错误的判断还不够严厉. 对边界情况的讨论其实应该是思维严密的表现,当然这并不能表明我写的一点错误都没有,只是多多分析一下还是很有好处的. #include <iostream> #include <fstream> #include <string> #include &l

POJ 1001

Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 143401   Accepted: 34998 Description Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the n