| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
感谢一位大虾的代码,作了小小的修改和注,抄袭在这里,表达不大准确,谨供和我一样挣扎过的菜鸟们参考,大虾谅解~#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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator