zoukankan      html  css  js  c++  java
  • 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,哈哈.


  • 相关阅读:
    关于李约瑟难题的思考
    《MDX解决方案(第2版)》实例数据部署过程
    在SQL SERVER 2008种使用表值参数
    解决了一个想了很久的问题
    发现可以在两个数据库中共享只读文件组
    java 包位置
    单元测试java
    Cannot determine build data storage root for project
    Vue——绑定值
    浪潮之巅第八章 — 没落的贵族(摩托罗拉)
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3824997.html
Copyright © 2011-2022 走看看