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

POJ做的非常好,本题就是要求一个无限位大的指数乘法结果。

要求基础:无限大数位相乘

额外要求:处理特殊情况的能力 -- 关键是考这个能力了。

所以本题的用例特别重要,再聪明的人也会疏忽某些用例的。

本题对程序健壮性的考查到达了变态级别了。

某人贴出的測试用例数据地址: http://poj.org/showmessage?message_id=76017

有了这些用例,几下调试就过了。

我关键漏了的用例:

000.10  1

000000  1

000.00  1

.00000  0

000010  1

#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

bool standardizeNumNoDot(string &s)
{
	while (!s.empty() && ‘0‘ == s[0]) s.erase(s.begin());
	if (s.empty()) s = "0";//防止n==1的时候,要输出0
	bool notDot = true;
	for (unsigned i = 0; i < s.size() && notDot; i++)
	{
		if (‘.‘ == s[i]) notDot = false;
	}
	if (notDot) return true;

	while (!s.empty() && ‘0‘ == s[s.size()-1]) s.erase(s.end()-1);
	if (!s.empty() && ‘.‘ == s[s.size()-1]) s.erase(s.end()-1);
	if ( s.empty() ) s = "0";
	return false;
}

int handleDecimalPoint(string &s)
{
	if (standardizeNumNoDot(s)) return 0;
	int fraction = 0;
	int j = 0;
	for (unsigned i = 0; i < s.size() ; i++)
	{
		if (fraction > 0) fraction++;
		if (s[i] != ‘.‘) s[j++] = s[i];
		else fraction++;
	}
	s.erase(s.end()-1);
	return fraction - 1;
}

string mulStr(string a, string b)
{
	if ("0" == a || "0" == b) return "0";
	int ap = handleDecimalPoint(a);
	int bp = handleDecimalPoint(b);

	string ans(a.size()+b.size(), ‘0‘);
	for (int i = a.size() - 1; i >= 0 ; i--)
	{
		int carry = 0;
		int an = a[i] - ‘0‘;
		for (int j = b.size() - 1; j >= 0 ; j--)
		{
			int bn = b[j] - ‘0‘;
			int sum = an * bn + carry + ans[i+j+1] - ‘0‘;
			carry = sum / 10;
			ans[i+j+1] = sum % 10 + ‘0‘;
		}
		if (carry) ans[i] += carry;
	}
	if (ap > 0 || bp > 0) ans.insert(ans.end() - ap - bp, ‘.‘);
	standardizeNumNoDot(ans);
	return ans;
}

string sPow(string s, int n)
{
	if (s.empty() || "0" == s) return "0";//为了程序的健壮性,一定要加上
	if (0 == n) return "1";
	if (1 == n) return s;

	string divideStr = sPow(s, n/2);
	divideStr = mulStr(divideStr, divideStr);
	if (n % 2) divideStr = mulStr(divideStr, s);
	return divideStr;
}

void Exponentiation()
{
	string s;
	int n;
	while(cin>>s>>n)
	{
		standardizeNumNoDot(s);//当n==1的时候
		cout<<sPow(s, n)<<endl;
	}
}

int main()
{
	Exponentiation();
	return 0;
}

本算法用时0MS,哈哈.

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

时间: 2024-10-14 21:58:20

POJ 1001 Exponentiation 无限大数的指数乘法 题解的相关文章

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(大数幂,还是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 解题报告 高精度大整数乘法模版

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

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 <

具有编译功能支持无限大数计算器的实现

本篇是MathAssist的第三篇,将在上篇所实现的BigNumber基础上完成具有编译功能支持无限大数的计算器SuperCalculator. 要想从形如 "(1.23435+sin(0.5*180/PI))*2468.2345" 字符串格式的表达式中求值,需要使用编译原理的知识,不过在一般的<数据结构>课程中都会讲解基础的表达式求值问题,而本篇也是在数据结构课程的基础上稍加拓展而实现. 多叉树的节点类型 node继承体系 表达式的值,一般将其转化成二叉树结构,根节点表示

大数加法、乘法

1 #include<iostream> 2 3 #include<stdio.h> 4 5 #include<string.h> 6 7 #define Len 3000//大数的长度 8 9 using namespace std; 10 11 int Input (char n[])//将大数读入的函数 12 13 { 14 15 char s[Len]; 16 17 int i,l; 18 19 20 21 for(i=0; i<Len; i++) n[i

大数相乘&mdash;&mdash;模拟乘法的运算规则

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> int main() { void add(int a[], int length1, int b[], int length2); char str1[255], str2[255]; int num1[255] = { 0 }, num2[255] = { 0 }; int product[255] = { 0 }, temp[255] =