HDOJ 1063 大数乘法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1063
输入数据中可能有小数点,也可能没有。题目的讨论板里面有人给出了比较特殊的测试数据。
代码写的比较乱…
#include <iostream> using namespace std; const int LEN = 130; int ans[LEN]; void doMultiply(int base) { for (int i = 0;i < LEN;i ++) ans[i] *= base; for (int i = 0;i < LEN;i ++) { ans[i + 1] += ans[i] / 10; ans[i] %= 10; } } void Output(int floatNum, int exp, int isInt) { int isAllZero = 1; for (int i = 0;i < LEN;i ++) if (ans[i] != 0) { isAllZero = 0; break; } if (isAllZero) { printf("0\n"); return; } //计算尾部的连续0的个数 int tailZeroLen = 0; for (int i = 0;i < LEN;i ++) { if (ans[i] != 0) break; tailZeroLen ++; } int totalFloatNum = floatNum * exp; int effectiveNumLen = 0; for (int i = LEN - 1;i >= 0 ;i --) { if (ans[i] != 0) { effectiveNumLen = i + 1; break; } } //是纯小数 if (totalFloatNum >= effectiveNumLen) { printf("."); for (int i = 0;i < (totalFloatNum - effectiveNumLen);i ++) printf("0"); for (int i = (effectiveNumLen - 1);i >= tailZeroLen;i --) printf("%d",ans[i]); printf("\n"); } else { for (int i = (effectiveNumLen - 1);i >= totalFloatNum;i --) printf("%d",ans[i]); //如果是整数,不用再输出了 if (isInt) { printf("\n"); return; } printf("."); for (int i = totalFloatNum - 1;i >= tailZeroLen;i --) printf("%d",ans[i]); printf("\n"); } } int main () { char input[10]; int exp;//指数 while (scanf("%[0-9.]%d\n",input,&exp) != -1) { //指数为0,结果为1 if (exp == 0) { printf("1\n"); continue; } memset(ans, 0, sizeof(ans)); int isFloatPointFound = 0, isInt = 1, floatNum = 0, pos = 0; //判断输入的数是否是整数 //两种情况 //1.没有小数点 2.小数点后面都是0 for (int i = 0;i < strlen(input);i ++) if (input[i] == '.') { isFloatPointFound = 1; break; } //如果没有小数点,则肯定是整数 if (isFloatPointFound == 0) isInt = 1; else { //如果输入数据有小数点,但是从最低位到小数点前一位都是0,则是整数 for (int i = strlen(input) - 1;i >= 0;i --) { if (input[i] == '.') break; if (input[i] != '0') isInt = 0; } } //反向存储输入数据 //如果输入数据是整数 if (isInt == 1) { floatNum = 0; //有小数点,从小数点的高一位开始取数 if (isFloatPointFound) { int i; for (i = strlen(input) - 1;i >= 0;i --) if (input[i] == '.') break; i --; for (;i >= 0;i --) { ans[pos] = input[i] - '0'; pos ++; } } //没有小数点,从最低位开始取 else { for (int i = strlen(input) - 1;i >= 0;i --) { ans[pos] = input[i] - '0'; pos ++; } } } //输入数据是小数,肯定包含了小数点 else { isFloatPointFound = 0; for (int i = strlen(input) - 1;i >= 0;i --) { if (input[i] == '.') isFloatPointFound = 1; else { ans[pos] = input[i] - '0'; pos ++; } if (isFloatPointFound == 0) floatNum ++; } } //将读入的数(浮点数或整数)统一转成一个整数base int base = 0, magnitude = 1; for (int i = 0;i < pos;i ++) { base += magnitude * ans[i]; magnitude *= 10; } for (int i = 0;i < (exp - 1);i ++) { //乘以exp - 1次 doMultiply(base); } Output(floatNum, exp, isInt); } return 0; }

浙公网安备 33010602011771号