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