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
- hdoj--1063 Exponentiation 解题报告
- HDU 1063 Exponentiation解题报告
- POJ1001 Exponentiation (解题报告)
- poj1001 Exponentiation 解题报告
- POJ 1001 Exponentiation解题报告
- POJ 1001 解题报告 Exponentiation
- UVa 748 Exponentiation解题报告
- POJ 1001 Exponentiation解题报告
- poj1001:1001:Exponentiation解题报告
- HDOJ 1063 Exponentiation
- HDOJ 1063 Exponentiation
- HDOJ 1063 Exponentiation
- ACM HDOJ 1063 (Exponentiation)
- HDOJ 1063 Exponentiation
- HDOJ 1063 Exponentiation
- pku 1001 高精度 Exponentiation 解题报告
- POJ 1001 Exponentiation [解题报告] Java
- POJ解题报告——1001 Exponentiation
- Visual Studio 2013开发 mini-filter driver step by step 获取文件读写内容(6)
- 【WebGL初学系列之一】WebGl基础知识
- Struts2框架的使用方法
- .Net下的多媒体定时器(适用于Winform和WPF程序)
- Calabash-Android用法入门
- hdoj--1063 Exponentiation 解题报告
- 微信也能报案 你听说过吗
- github的使用方法之一
- MonoDevelop当保存时跳到最顶端解决办法
- Set Matrix Zeroes
- 开发板上进行gdb调试
- java 数据类型
- Java开发中的23种设计模式详解
- pflua:用Lua编写的高性能网络包过滤工具箱