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

感谢一位大虾的代码,作了小小的修改和注,抄袭在这里,表达不大准确,谨供和我一样挣扎过的菜鸟们参考,大虾谅解~

Posted by bhq at 2009-03-21 11:18:31 on Problem 1001
#include < iostream >
using namespace std ;

int Length ( int a )
{
	int k = 0 ;
    while ( a / 10 != 0 )
	{
		k++ ;
		a /= 10 ;
	}
	return k + 1 ;
}

int main ( )
{
	double a ;
	int n ;
	while ( cin >> a >> n )
	{
		if ( n == 1 )
		{
			cout << a << endl ;
			continue ;
		}
		long int at[5000] , bt[5000] ;
		int btl , dot ;
        if ( Length ( (int)a ) == 1 )
		{
			dot = 4 ;
			a *= 10000 ;
		}
		else
		{
			dot = 3 ;
			a *= 1000 ;
		}//由于输入的a只有六位有效数字,所以此处对其进行这样的处理,使"实数a"的运算转化为"整数a"的运算。
		dot *= n ;//dot在后面用来确定小数点的输出位置
		int k = a ;
		long int g = a ;
		int i = Length(k) , j = 4999 ;
        btl = i ;//btl为bt[]中存放有效数据的元素的个数
		while ( i > 0 )
		{
			bt[j--] = k % 10 ;
			k /= 10 ;
			i-- ;
		}//将k各位存入bt[]尾部
		while ( --n > 0 )
		{
			k = 0 ;
			j = 5000 - btl ;
            while ( k < btl )
			{
				at[k++] = bt[j] ;
				bt[j] = 0 ;
				j++ ;
			}//将bt[]尾部各元素复制到at[]头部,并将bt[]尾部元素置零
			k-- ;
			j = 4999 ;
			while ( k >= 0 )
			{
				bt[j-1] = ( at[k] * g + bt[j] ) / 10 ;
				bt[j] = ( at[k] * g + bt[j] ) % 10 ;
				k-- ;
				j-- ;
			}//完成"乘g运算",将结果存入bt[]尾部,但此时bt[j]中的数值不是运算结果的最高位,而是一个较大的整数
            int m = bt[j] ;
			while ( m > 0 )
			{
				bt [j--] = m % 10 ;
				m /= 10 ;
			}//将bt[j]中的较大的整数的各位数字分离,此bt[]中存放着"乘g运算"的结果的各位数字
			btl = 4999 - j ;
		}//完成"整数a"的n次方的运算
        if ( j + 1 > 4999 - dot )
		{
			cout << "." ;
			for ( int t = 0 ; t < dot + j - 4999 ; t++ )
			{
				cout << 0 ;
			}
		}//将小数点及小数点后应该有的0输出(如果开始时输入的a是小于1的小数,这些语句才会执行)
        int te = 4999 ;
		while ( bt[te] == 0 && te > 4999 - dot )
		{
			te-- ;
		}//使te指向bt[]尾部序号最大的非零元素
		for ( int it = j + 1 ; it <= te ; it++ )
		{
			if ( it == 4999 - dot && te != 4999 - dot )
			{
				cout << bt[it] << "." ;
			}//若应该输出的结果有部分小数,在恰当位置输出小数点;若若应该输出的结果是整数,则不输出小数点
			else cout << bt[it] ;
		}//按要求输出结果
		cout << endl ;
	}
	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