2014年10月2日星期四

[UVa] 748 - Exponentiation

比較難處理的一題
這邊要將前面和後面的0通通去掉
在 print 函數裡下了不少工夫
大數運算參考 演算法筆記  - Big Number
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#define maxn 1000
using namespace std;
// print

int dot;
void print(int a[maxn]){
  int i=maxn-1;       // 要印的數字位置
  int stop=0; 
  int dot_appear=0;
  while(i>=0 && a[i]=='\0' && i+1>dot) i--; // 數字開頭的零都不印
  if(i<0)cout << '0';
  else while(i>=0 && stop!=1) { //stop不等於1時,持續輸出數字
 if(i+1==dot){
   cout << '.';
   dot_appear=1;
 }
 if(dot_appear==1){ //從輸出小數點後,針對後面的數字做檢查
   stop=1; //若後面皆為0,則stop=1
   for(int j=i;j>=0;j--){
     if(a[j]!=0){ //若後面有非0者,stop=0
       stop=0; break;
     }
   }
 }
 if(stop!=1)cout << a[i]; 
 i--;
  }
}
 // c = a * b;
void mul(int a[maxn], int b[maxn], int c[maxn]){
  for (int i=0; i<maxn; i++)
    c[i] = 0;
     
    for (int i=0; i<maxn; i++)
      for (int j=0; j<maxn; j++)
        if (i+j < maxn)
          c[i+j] += a[i] * b[j];
                    
    for (int i=0; i<maxn-1; i++) // 一口氣進位
    {
      c[i+1] += c[i] / 10;
      c[i] %= 10;
    }
}

char input[maxn]; 
int a[maxn],b[maxn],result[maxn];

int main(){
  freopen("input.txt","r",stdin);
  for(int i=0;i<maxn;i++)a[i]='\0';
  for(int i=0;i<maxn;i++)b[i]='\0';
  for(int i=0;i<maxn;i++)result[i]='\0';
  
  while(scanf("%s",&input)!=EOF){
    
 //紀錄小數點後有幾位
 dot=0;
 int len = strlen(input);
 for(int i=len-1;i>0;i--){
   if(input[i]=='.')break;
   dot++;
 }
 
 //change input into integer array
    for(int i=0;i<len;i++){
   a[i]=input[len-i-1]-48;
 }
 
 //將小數點去掉
 for(int i=dot;i<len;i++){
   a[i]=a[i+1];
   a[i+1]=0;
 }
 
 
 for(int i=0;i<maxn;i++)b[i]=a[i]; //將a複製給b
 
 int n;
 scanf("%d",&n);
 dot *= n; //乘幾次,小數點後位數就加倍幾次
 n--;
 while(n--){
   mul(a,b,result); //每次的b乘給a
   for(int i=0;i<maxn;i++)b[i]=result[i]; //將result複製給b
 }
 
 /*
 for(int i=0;i<maxn;i++){
   if(result[i]==0)printf("%d",result[i]);
   else if(result[i]=='\0'); 
   else printf("%d",result[i]);
 }
 */
 //printf("\n");
    print(result);
    printf("\n");
 
  }
  
  return 0;  
} 

沒有留言: