【POJ】 1001-Exponentiation

题目:

Exponentiation

Time Limit: 500MS   Memory Limit: 10000K
Total Submissions: 139077   Accepted: 33994

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, and the 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

思路:

把输入全部转换成整数,剔除小数点,按整数高精度运算后再加入小数点

代码:

//21:10  --  23:11
#include <stdio.h>
#include <string.h>

char res[10006], sa[10006], sb[10006], tsb[10006];

void show(char *s)
{
	char *p;
	if (*s == 0 && *(s + 1) == -2)
		++s;
	if (*s == -2 && *(s + 1) == -1)
	{
		printf("0");
		return;
	}

	p = s;
	while (*++p != -1)
		;
	--p;
	while (*p != -2 && *p == 0)
		--p;
	if (*p == -2)
		--p;
	++p;

	while (s != p)
	{
		if (*s == -2)
			putchar('.');
		else
			putchar('0' + *s);
		++s;
	}
}
void pre(char *s)
{
	while (*s != '\0')
	{
		if (*s == '.')
			*s = -2;
		else
			*s -= '0';
		++s;
	}
	*s = -1;
}
void owncpy(char *s, char *p)
{
	while (*p != -1)
	{
		*s++ = *p++;
	}
	*s = -1;
}
char* multiple(char *s, char *a, char *b)
{
	memset(s, 0, sizeof(char) * 10006);
	int i, flags = 0, lena = 0, lenb = 0, ea, eb;
	for (i = 0; a[i] != -1; ++i)
	{
		if (flags == 1)
		{
			a[i - 1] = a[i];
			lena++;
		}
		if (a[i] == -2)
		{
			flags = 1;
			lena = 0;
		}
	}
	ea = flags ? i - 2 : i - 1;
	flags = 0;
	for (i = 0; b[i] != -1; ++i)
	{
		if (flags == 1)
		{
			b[i - 1] = b[i];
			lenb++;
		}
		if (b[i] == -2)
		{
			flags = 1;
			lenb = 0;
		}
	}
	eb = flags ? i - 2 : i - 1;

	int x, y, c;
	s[10001] = -1;
	for (x = ea; x >= 0; --x)
	{
		for (y = eb; y >= 0; --y)
		{
			c = 10000 - (ea - x + eb - y);
			s[c] += a[x] * b[y];
			if (s[c] > 9)
			{
				int tp = s[c] / 10;
				s[c] %= 10;
				s[c - 1] += tp;
			}
		}
	}

	int first = 10000 - (ea + eb + 5);
	while (first <= 10000 && s[++first] == 0)
		;
	int f = 0, ploc;
	if (lena + lenb >= 10000 - first + 1)
	{
		s[f++] = 0;
		s[f++] = -2;
		int k = lena + lenb - (10000 - first + 1);
		while (k--)
			s[f++] = 0;
	}
	else
	{
		ploc = 10000 - lena - lenb;
		while (first <= ploc)
			s[f++] = s[first++];
		s[f++] = -2;
	}

	while (first <= 10000)
		s[f++] = s[first++];
	s[f] = -1;
	return s;
}
void ownpow(int n)
{
	while (--n)
	{
		multiple(res, sa, sb);
		owncpy(sa, res);
		owncpy(sb, tsb);
	}
}
int main()
{
	int n;
	while (~scanf("%s %d", sa, &n))
	{
		pre(sa);
		owncpy(sb, sa);
		owncpy(tsb, sa);
		owncpy(res, sa);
		ownpow(n);
		show(res);
		printf("\n");
	}
	return 0;
}
时间: 2024-09-30 22:55:46

【POJ】 1001-Exponentiation的相关文章

【POJ】2278 DNA Sequence

各种wa后,各种TLE.注意若AC非法,则ACT等一定非法.而且尽量少MOD. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 #define MAXN 105 8 #define NXTN 4 9 10 char str[15]; 11 12 typedef struct Matrix {

【POJ】1739 Tony&#39;s Tour

http://poj.org/problem?id=1739 题意:n×m的棋盘,'#'是障碍,'.'是空白,求左下角走到右下角且走过所有空白格子的方案数.(n,m<=8) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; #define BIT(a,b) ((a)<<((b)<<1)) #

【POJ】2449 Remmarguts&#39; Date(k短路)

http://poj.org/problem?id=2449 不会.. 百度学习.. 恩. k短路不难理解的. 结合了a_star的思想.每动一次进行一次估价,然后找最小的(此时的最短路)然后累计到k 首先我们建反向边,跑一次从汇到源的最短路,将跑出来的最短路作为估价函数h 根据f=g+h 我们将源s先走,此时实际价值g为0,估价为最短路(他们的和就是s-t的最短路) 将所有s所连的边都做相同的处理,加入到堆中(假设此时到达的点为x,那么x的g等于s到这个点的边权,因为根据最优,g+h此时是从x

【POJ】2318 TOYS ——计算几何+二分

TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10281   Accepted: 4924 Description Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have a problem - their child John never puts his toys away w

【POJ】3009 Curling 2.0 ——DFS

Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11432   Accepted: 4831 Description On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules are somewhat different from ours. The game is

【POJ】1056 IMMEDIATE DECODABILITY

字典树水题. 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 5 typedef struct Trie { 6 bool v; 7 Trie *next[2]; 8 } Trie; 9 10 Trie *root; 11 12 bool create(char str[]) { 13 int i = 0, id; 14 bool ret = false; 15 Trie *p = root

【POJ】2418 Hardwood Species

简单字典树. 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 5 #define MAXN 128 6 7 typedef struct Trie { 8 int count; 9 Trie *next[MAXN]; 10 Trie() { 11 count = 0; 12 for (int i=0; i<MAXN; ++i) 13 next[i] = NULL; 14 } 15 }

【POJ】2513 Colored Sticks

字典树+并查集. 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 5 #define MAXN 500005 6 #define MAXL 11 7 #define TRIEN 26 8 9 typedef struct Trie { 10 int v; 11 Trie *next[TRIEN]; 12 Trie() { 13 v = 0; 14 for (int i=0; i<TRI

【POJ】 2528 - Mayor&#39;s posters 【线段树+离散化】

题目: Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 47228   Accepted: 13719 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral

【POJ】3283 Card Hands

字典树. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <stack> 6 using namespace std; 7 8 #define TRIEN 56 9 10 typedef struct Trie { 11 Trie *next[TRIEN]; 12 Trie() { 13 for (int i