1. 程式人生 > >【高精度】c++ stl解決poj1001問題

【高精度】c++ stl解決poj1001問題

前言
從去年大四初,保送研究生之後,就沒有任何的就業壓力了。而現在,作為研一的新生,卻聽到師兄們找工作諸多不順的訊息。自己就在CSDN上搜了一些面試題來做做看。雖然,學過C/C++/JAVA,桌面開發MFC,手機android開發,matlab等等。也開發過一些小的專案,但是,看到這些面試題時,發現大量的考察演算法和資料結構等知識。於是乎,我需要加強自己對資料結構的理解和演算法的實現。拿POJ上面的題目練練手。
Poj1001[http://poj.org/problem?id=1001]
Description
Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a taxing experience for many computer systems. 
This problem requires that you write a program to compute the exact value of Rn where R is a real number ( 0.0 < R < 99.999 ) and n is an integer such that 0 < n <= 25.
Input

The input will consist of a set of pairs of values for R and n. The R value will occupy columns 1 through 6,andthe n value will be in columns 8 and 9.
Output
The output will consist of one line for each line of input giving the exact value of R^n. Leading zeros should be suppressed in the output. Insignificant trailing zeros must not be printed. Don't print the decimal point if the result is an integer.
Sample Input

95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12
Sample Output
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201

我用c++ stl解決了此問題。

編譯器:G++(vc++6.0不能通過!)

廢話少說,貼程式碼:

/*
*author:ZhengHaibo
*email:[email protected]
*copyright:ZhengHaibo
*Nanjing University Of Posts and TeleCom.
*/
#include<iostream>  
#include<cstring>  
#include<vector>
using namespace std;
//calculate v1*v2
vector<int> Multi(vector<int> v1,vector<int> v2)
{
   vector<int> vt;//save the result
   for (int i=0;i<v1.size()+v2.size()+1;i++)
   {
	   vt.push_back(0);//Init to 0
   }
   for (int i=0;i<v1.size();i++)
   {
	   for (int j=0;j<v2.size();j++)
	   {
		   vt[i+j]+=v1[i]*v2[j];
		   vt[i+j+1]+=vt[i+j]/10;
		   vt[i+j]%=10;
	   }
   }
   return vt;
}
int main()  
{
	string str;
	int n;
	while(cin>>str>>n){
		vector <int> numArray;
		vector <int> resultArray;
		int dotPos=0,IndexLen;
		IndexLen=str.length()-1;
		//delete 0 in the tail of str. 12.10 ->12.1
		for (int i=str.length()-1;i>=0;i--)
		{
			if(str[i]!='0')
			{
				IndexLen=i;
				break;
			}
		}
		//transform string to vector<int>
        for (int i=IndexLen;i>=0;i--)
        {
			if (str[i]!='.')
			{
				numArray.push_back(str[i]-'0');
			}
			else
				dotPos=IndexLen-i;
        }
		//copy vector
		for (int i=0;i<numArray.size();i++)
		{
			resultArray.push_back(numArray[i]);
		}
		//calculate numArray^n
		for (int j=0;j<n-1;j++)
		{
            resultArray = Multi(resultArray,numArray);
			int len=resultArray.size();
			while (resultArray[len-1]==0)//remove 0 in the big bit
			{
				resultArray.pop_back();
				len--;
			}

		}
		//output the resultArray in prooply way
		if(n*dotPos>=resultArray.size())//if the result is less than 1,the dot pos is out of resultArray
		{
			cout<<".";
			for(int k=0;k<n*dotPos-resultArray.size();k++)
			{
				cout<<"0";
			}
		}
		for (int k=resultArray.size()-1;k>=0;k--)
		{
			if (k==n*dotPos-1)//the dot pos is in resultArray
			{
				if (k!=0)
				{
	                cout<<".";
				}
			}
             cout<<resultArray[k];
		}
		cout<<endl;//if not,Presentation Error!
		//by ZhengHaibo njupt
	}
	return 0;
}


我第一次提交的時候,忘記了每行最後有一個回車,結果顯示“Presentation Error”,加上cout<<endl;就好了。


相關推薦

精度c++ stl解決poj1001問題

前言:從去年大四初,保送研究生之後,就沒有任何的就業壓力了。而現在,作為研一的新生,卻聽到師兄們找工作諸多不順的訊息。自己就在CSDN上搜了一些面試題來做做看。雖然,學過C/C++/JAVA,桌面開發MFC,手機android開發,matlab等等。也開發過一些小的專案,但

精度精度分數[c++]

【高精度】高精度分數

貪心精度zoj3987 Numbers

value 位或 trac stream 如果 ber argc () 枚舉 題意:給你一個數n,讓你找m個非負整數,使得它們的和為n,並且按位或起來以後的值最小化。輸出這個值。 從高位到低位枚舉最終結果,假設當前是第i位,如果m*(2^i-1)<n的話,那麽說明這

精度精度階乘

class tro 分享 sub data pid ble clu 問題 問題 F: 【高精度】高精度階乘 時間限制: 1 Sec 內存限制: 64 MB提交: 297 解決: 58[提交] [狀態] [討論版] [命題人:] 題目描述 《魔法寶典》對於修羅王是如此重

精度精度乘法

con img sub alt 狀態 圖片 hide num mst 問題 J: 【高精度】高精度乘法 時間限制: 1 Sec 內存限制: 64 MB提交: 286 解決: 94[提交] [狀態] [討論版] [命題人:] 題目描述 牢門上的第三道鎖,需要使用高精度乘

精度密碼

一秒 creat problem lap sam href enter lang gre 問題 F: 【高精度】密碼 時間限制: 1 Sec 內存限制: 64 MB提交: 11 解決: 8[提交] [狀態] [討論版] [命題人:] 題目描述 人們在做一個破譯密碼遊戲

精度加法天才

creat return name 能力 content 遊戲 aec jumbo 時間限制 問題 A: 【高精度】加法天才 時間限制: 1 Sec 內存限制: 64 MB提交: 14 解決: 10[提交] [狀態] [討論版] [命題人:] 題目描述 貝貝是一

精度精度

問題 D: 【高精度】高精度冪 時間限制: 1 Sec  記憶體限制: 64 MB 題目描述 經過測試,修羅王發現開啟魔法手銬的方法是需要求一個正整數a(1<a<10100)的N(1<N<108)次方,但只要求輸出最後100

精度簡單精度加法(大數加法)

問題 B: 【高精度】簡單高精度加法 時間限制: 1 Sec  記憶體限制: 64 MB 題目描述 修羅王解決了計算機的記憶體限制問題,終於可以使用電腦進行大型的魔法運算了,他交給邪狼的第一個任務是計算兩個非負整數A、B的和,其中A和B的位數在50

精度模板

 自己上學期花了三天打的,long long壓9位,支援進位制轉換,加減乘除,字串初始化,運算等等,應該無敵了 #include<cstdio> #include<algorithm> #include<cstring> using namespace

精度大整數類

把這段模版敲上,直接像定義int一樣定義變數就行了,支援加減和賦值、輸入、輸出(只能用cin,cout) struct BigInteger{ int size,num[1000]; BigInteger(){ size=0;

[bzoj1002][FJOI2007]輪狀病毒精度矩陣樹定理

【題目描述】Description  輪狀病毒有很多變種,所有輪狀病毒的變種都是從一個輪狀基產生的。一個N輪狀基由圓環上N個不同的基原子和圓心處一個核原子構成的,2個原子之間的邊表示這2個原子之間的資訊通道。如下圖所示  N輪狀病毒的產生規律是在一個N輪狀基中刪去若干條邊,使

精度麥森數 NOIP 2003

[NOIP2003]麥森數 時間限制: 1 Sec  記憶體限制:64 MB 題目描述 形如2^p-1的素數稱為麥森數,這時p一定也是個素數。但反過來不一定,即如果p是個素數,2^p-1不一定也是素數。到1998年底,人們已找到了37個麥森數。最大的一個是p=3

精度 利用分段儲存的方法儲存大數與運算

引:有時候我們遇到一種圖論題,就是要你將算出來的路徑中每條邊的權值之積或和求出來,雖然每條邊的權值都比較小,但算到最後結果卻很大,不得不用高精度方法儲存資料的時候,你怎麼處理? 傳統的高精度是用char[]陣列來儲存,這個對於上述問題,運算起來並不是很方便,這裡介紹一種基

精度乘法NOIP2003麥森數

bottom clas map 復制 題目 radi 最大的 bit while 題目描述 形如2^{P}-12P?1的素數稱為麥森數,這時PP一定也是個素數。但反過來不一定,即如果PP是個素數,2^{P}-12P?1不一定也是素數。到1998年底,人們已找到了37個麥森數

精度 JAVAHDU 5920 Ugly Problem

cti == tin ati pri 包裝類 out class gin 題意 給你一個數字n(n < 10^1000),將其拆成若幹個回文串(不超過50個)輸出拆分方案 分析 不難想到,我們可以每次給n減一個小於他的最大的回文串,這樣能夠盡量構造出最少數量的回文串,

精度&想法題Count the Even Integers @ICPC2017HongKong/upcexam5563#Java

時間限制: 1 Sec 記憶體限制: 128 MB Yang Hui’s Triangle is defined as follow. In the first layer, there are two numbers A1,1 and A1

分類 - C++-STL

專欄達人 授予成功建立個人部落格專欄

精度+快速冪 麥森數

【題目大意】從檔案中輸入P(1000<P<3100000),計算的位數和最後500位數字(用十進位制高精度數表示) 【思路】高精度+快速冪,程式碼實現有點煩,但至少比高精減要好。。。 對於位數,首先可以確定和的位數一定是相同的。因為2的若干次方最後一位一定是大於0的。 考慮把

精度演算法A/B 精度除以低精度 保留小數

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> cha