Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

过了,不过有一个莫名其妙的presentation error

Posted by frkstyc at 2004-10-23 10:04:44 on Problem 1001
#include <stdio.h>
#include <stdlib.h>
//#include <iostream>
//#include <iomanip>
//#include <cstdio>
//using namespace std;

#define MAX (63)
#define BASE (100000)
#define LGBASE (5)

typedef long long INT;

typedef struct
{
	INT digit[MAX];
	int len;
} bigint;

void output(bigint *a, int expo)
{
	int i, j;
	char str[256];
//	memset(str, 0, sizeof(str));
	for(i = a->len - 1; i >= 0; i--)
	{
		sprintf(str + (a->len - 1 - i) * LGBASE, "%5lld", a->digit[i]);
		for(j = (a->len - 1 - i) * LGBASE; str[j] == ' '; j++)
		{
			str[j] = '0';
		}
	}
	expo += LGBASE * a->len;
	if(expo < 0)
	{
		j = a->len * LGBASE;
		while(str[j - 1] == '0')
		{
			j--;
		}
		str[j] = '\0';
		putchar('.');
		while(expo < 0)
		{
			putchar('0');
			expo++;
		}
//		puts(str);			假如用这行输出后会有一个莫名其妙的换行,别的地方都不会这样
		for(j = 0; str[j] != '\0'; j++)
		{
			putchar(str[j]);
		}
	}
	else
	{
		if(expo >= LGBASE * a->len)
		{
			for(i = 0; str[i] == '0'; i++)
			{
				;
			}
			puts(str + i);
			for(j = 0; j < expo - LGBASE * a->len; j++)
			{
				putchar('0');
			}
		}
		else
		{
			j = a->len * LGBASE;
			while(str[j - 1] == '0')
			{
				j--;
			}
			str[j] = '\0';
			for(i = 0; str[i] == '0' && i < expo; i++)
			{
				;
			}
			for(j = i; str[j] != '\0'; j++)
			{
				if(j == expo)
				{
					putchar('.');
				}
				putchar(str[j]);
			}
			while(j < expo)
			{
				putchar('0');
				j++;
			}
		}
	}
	putchar('\n');
}

bigint mult(bigint *a, bigint *b)
{
	int i, j;
	INT carry = 0;
	bigint p;
	p.len = a->len + b->len;
	for(i = 0; i < p.len; i++)
	{
		p.digit[i] = 0;
	}
	for(i = 0; i < a->len; i++)
	{
		for(j = 0; j < b->len; j++)
		{
			p.digit[i + j] += a->digit[i] * b->digit[j];
		}
	}
	for(i = 0; i < p.len; i++)
	{
		p.digit[i] += carry;
		carry = p.digit[i] / BASE;
		p.digit[i] %= BASE;
	}
	if(p.digit[p.len - 1] == 0)
	{
		p.len--;
	}
	return p;
}

int main(int argc, char** argv)
{
	char str[8];
	int n;
	while(scanf("%6s %2d\n", str, &n) != EOF)
//	while(cin >> str, cin >> n, /*cin >> pad,*/ !cin.fail())
	{
		int expo;
		bigint base, power;
		power.len = 1;
		power.digit[0] = 1;
		base.len = 1;
		if(str[0] == '.')
		{
			expo = -5 * n;
			base.digit[0] = (str[1] - '0') * 10000 +
					(str[2] - '0') * 1000 +
					(str[3] - '0') * 100 +
					(str[4] - '0') * 10 +
					(str[5] - '0');
		}
		if(str[1] == '.')
		{
			expo = -4 * n;
			base.digit[0] = (str[0] - '0') * 10000 +
					(str[2] - '0') * 1000 +
					(str[3] - '0') * 100 +
					(str[4] - '0') * 10 +
					(str[5] - '0');
		}
		if(str[2] == '.')
		{
			expo = -3 * n;
			base.digit[0] = (str[0] - '0') * 10000 +
					(str[1] - '0') * 1000 +
					(str[3] - '0') * 100 +
					(str[4] - '0') * 10 +
					(str[5] - '0');
		}
		if(str[3] == '.')
		{
			expo = -2 * n;
			base.digit[0] = (str[0] - '0') * 10000 +
					(str[1] - '0') * 1000 +
					(str[2] - '0') * 100 +
					(str[4] - '0') * 10 +
					(str[5] - '0');
		}
		if(str[4] == '.')
		{
			expo = -n;
			base.digit[0] = (str[0] - '0') * 10000 +
					(str[1] - '0') * 1000 +
					(str[2] - '0') * 100 +
					(str[3] - '0') * 10 +
					(str[5] - '0');
		}
		if(str[5] == '.')
		{
			expo = 0;
			base.digit[0] = (str[0] - '0') * 10000 +
					(str[1] - '0') * 1000 +
					(str[2] - '0') * 100 +
					(str[3] - '0') * 10 +
					(str[4] - '0');
		}
		while(n > 0)
		{
			if(n % 2 == 1)
			{
				power = mult(&power, &base);
			}
			base = mult(&base, &base);
			n >>= 1;
		}
		output(&power, expo);
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator