hdoj--1063 Exponentiation 解题报告

来源:互联网 发布:snailsvn mac 怎么用 编辑:程序博客网 时间:2024/06/05 19:59

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1063

(唠叨:打算以后多做些题,并且是自己思考那种,除非毫无头绪,不看别人的解题报告!奋斗了两天多终于AC,纪念一下)

1、题意分析

1.1、题意是求浮点数的指数,用到的知识包括,两个大数加(A+B)、两个大数乘(A*B),大数乘又利用了大数乘一位数(A*b)

1.2、题目的难点不是以上所述的大数操作,而是输出部分的格式控制,引用Discuss中的说法,“没有通过,肯定是测试样例不够”,在结尾部分贴有搜索到的测试样例

2、思路分析


2.1 大数操作

这里采用字符保存结果。将浮点数转化为整数相乘,最后添加小数位。如1.1*1.1,化为11*11,然后添加小数点。
要想完成两个大数相乘,方法如同小学时老师所授的乘法,从个位开始乘,然后是十位...之后将结果相加即可。(可以自己用笔动手试试)。

2.2 输出控制

我对格式控制,主要是分两类,一类是整数,另一类是浮点数。
1、 整数需要去除前导(00012;0000),并且需要防范全部为零
2、浮点数也需要分两类考虑,整数部分和小数部分,如(012.0012;00.001;00.0000;00.001100)
1)整数部分需要去除前导零,采用从前往后查找,由于0.123输出格式是.123,因而只需确定第一个非零数的位置或者是小数点的位置p1
2)小数部分需要去除尾部零,采用从后往前查找,找到最后一个非零数字,或者是小数点的位置p2
3)截取p2到p1之间的数字,并进行后期处理

3、代码部分

#include <iostream>using namespace std;#define SIZE 10#define MAX 1001char sa[SIZE],sb[SIZE];char s1[MAX],s2[MAX],s3[MAX],s4[MAX];//字符串反转void StrRvs(char* s){int i, len;char ch;len = strlen(s);i = 0;s[len] = '\0';len = len - 1; while(i < len){ch = s[len];s[len] = s[i];s[i] = ch;i++;len--;}}int main(){freopen("in.txt","r",stdin);//fropen("out.txt","w",stdout);int i, j, i1, i2, i3, i4, k, pos, t, n, lenb, carry, len1;while(cin>>sa>>n){//对字符串预处理,寻找小数点的位置,并将浮点数转换为整数i = j = 0;pos = -1;//-1表示整数memset(s1,0,sizeof(char)*MAX);while(sa[i] != '\0'){if(sa[i] == '.'){pos = strlen(sa) - i - 1; //这里的pos表示有几位小数}else {sb[j] = sa[i]; j++;}i++;}sb[j] = '\0';StrRvs(sb);//对字符串反转lenb = strlen(sb);strcpy(s1,sb);  //s1保存最后结果for(i = 1; i < n; i++){memset(s3,0,sizeof(char)*MAX);//s3保存 sb^i的结果for(k = 0; k < lenb; k++){//偏移的位数memset(s2,0,sizeof(char)*MAX); //保存 s3 * sb[k]的结果memset(s4,0,sizeof(char)*MAX);//临时保存 sb^i的结果,即 s3 * sb for(i2 = 0; i2 < k; i2++)s2[i2] = '0';carry = 0;i1 = 0;//逐位相乘while(s1[i1] != '\0'){t = (s1[i1] - '0') * (sb[k] - '0') + carry;carry = t / 10;t = t % 10 + '0';s2[i2] = t;i1++;i2++;}if(carry > 0){s2[i2] = carry + '0';i2++;}s2[i2] = '\0';//诸位相乘后的结果相加//cout<<s2<<endl;i2 = i3 = i4 = 0; carry  = 0;while(s2[i2] != '\0' && s3[i3] != '\0'){t = s2[i2] + s3[i3] + carry - 2 *'0';carry = t / 10;t = t % 10 + '0';s4[i4] = t;i2++;i3++; i4++;}while(s2[i2] != '\0'){t = s2[i2] + carry - '0';carry = t / 10;t = t % 10 + '0';s4[i4] = t;i2++; i4++;}while(s3[i3] != '\0'){t = s3[i3] + carry - '0';carry = t / 10;t = t % 10 + '0';s4[i4] = t;i3++; i4++;}if(carry != 0){s4[i4] = carry + '0';i4++;}s4[i4] = '\0';strcpy(s3,s4);}//s1设置为新的被乘数strcpy(s1, s4);}StrRvs(s1);//输出格式控制len1 = strlen(s1);i1 = 0; i2 = 0; memset(s2,0,sizeof(char)*MAX);if(pos == -1){//如果是整数while(s1[i1] != '\0' && s1[i1] == '0'){i1++;}while(s1[i1] != '\0'){s2[i2] = s1[i1];i1++;i2++;}}else{pos = pos * n;//前导0处理while(s1[i1] != '\0' && i1 < len1 - pos && s1[i1] == '0')i1++;i3 = len1 - 1;//尾部0处理,如果找到len1-pos,即XX.0000,i3继续-1,则可不添加小数点while(i3 >= len1 - pos && s1[i3] == '0'){i3--;}i2 = 0;while(i1 <= i3){if(i1 == len1 - pos){s2[i2] = '.';i2++;}s2[i2] = s1[i1];i1++;i2++;}}s2[i2] = '\0';if(s2[0] == '\0')cout<<"0"<<endl;else if(n == 0)cout<<"1"<<endl;elsecout<<s2<<endl;}return 0;}

4、测试用例


95.999 2595.123 120.4321 205.1234 156.7592  998.999 101.0100 1220 2520 30.01 35.1004 15000.10 2012.010 20.10000 25110000 201.0000 251 00 10001.1 195.123 12 0.4321 20 5.1234 15 6.7592 9 98.999 10 1.0100 12 .00001 1 .12345 1 0001.1 1 1.1000 1 10.000 1 000.10 1 000000 1 000.00 1 .00000 0 000010 1 000.10 1 0000.1 1 00.111 1 0.0001 1 0.0001 3 0.0010 1 0.0010 3 0.0100 1 0.0100 3 0.1000 1 0.1000 3 1.0000 1 1.0000 3 1.0001 1 1.0001 3 1.0010 1 1.0010 3 1.0100 1 1.0100 3 1.1000 1 1.1000 3 10.000 1 10.000 3 10.001 1 10.001 3 10.010 1 10.010 3 10.100 1 10.100 3 99.000 1 99.000 3 99.001 1 99.001 3 99.010 1 99.010 3 99.100 1 99.100 3 99.998 1 99.998 3 001.10 2      000.01 0      011.01 3      000.00 2      000000 2      00000. 2      0.0100 2      99.999 0      0.1 2123.00 1123.01 1.12345 195.123 120.4321 205.1234 156.7592  998.999 101.0100 12.00001  1.12345  10001.1  11.1000  110.000  1000.10  1000000  1000.00  1.00000  0000010  1000.10  10000.1  100.111  10.0001  10.0001  30.0010  10.0010  30.0100  10.0100  30.1000  10.1000  31.0000  11.0000  31.0001  11.0001  31.0010  11.0010  31.0100  11.0100  31.1000  11.1000  310.000  110.000  310.001  110.001  310.010  110.010  310.100  110.100  399.000  199.000  399.001  199.001  399.010  199.010  399.100  199.100  399.998  199.998  3

结果:
36030287527706364985996287299002559592974094536854.887597557187589626090135471973074923657152490028702478213516490035202399999548815620517731830194541.899025343415715973535967221869852721.0000000514855464107695612199451127676715483848176020072635120383542976301346240143992025569.92857370126648804114665499331870370751166629547672049395302429448126.76412102161816443020690903717327667290429072743629540498.1075960194566517745610440100011.1268250301319697206612013355443200000000000000000000000008000.00000141120989454.314570363993506408035342551967503175087477761156936917581824.000000000000000000013898164373852177448724.95969148783929754827221448018421936240011672749994932560009201000000000000000000000000000000000000000000000000000000000000000000000000000000001101.1548815620517731830194541.899025343415715973535967221869852721.0000000514855464107695612199451127676715483848176020072635120383542976301346240143992025569.92857370126648804114665499331870370751166629547672049395302429448126.76412102161816443020690903717327667290429072743629540498.1075960194566517745610440100011.126825030131969720661201.00001.123451.11.110.100010.1.1.111.0001.000000000001.001.000000001.01.000001.1.001111.00011.0003000300011.0011.0030030011.011.0303011.11.33110100010.0011000.30003000110.011003.00300110.11030.3019997029999.001970328.40329700199.01970593.05970199.1973242.27199.998999940.0011999921.2111334.633301000.00011.01123123.01.12345548815620517731830194541.899025343415715973535967221869852721.0000000514855464107695612199451127676715483848176020072635120383542976301346240143992025569.92857370126648804114665499331870370751166629547672049395302429448126.76412102161816443020690903717327667290429072743629540498.1075960194566517745610440100011.126825030131969720661201.00001.123451.11.110.100010.1.1.111.0001.000000000001.001.000000001.01.000001.1.001111.00011.0003000300011.0011.0030030011.011.0303011.11.33110100010.0011000.30003000110.011003.00300110.11030.3019997029999.001970328.40329700199.01970593.05970199.1973242.27199.998999940.001199992

0 0
原创粉丝点击