POJ 1001思路及代码

  • 输入:浮点数和幂指数
    输入的浮点数带上小数点固定6位

  • 输出:幂运算结果
    输出的0.xx输出.xx 小数点后没有多余的0

  • 思路:先确定小数点的位置,后使用数组的方式按照列竖式的方法计算

  • 参考:https://www.cnblogs.com/lsdsjy/archive/2012/11/03/2752948.html

  #include<iostream>
  #include<string>
  using namespace std; 

  int main(){
      string num_float;
      int n;

      while(cin >> num_float >> n){
          //find .
          int point_pos;
          for(int i = 1;i<6;i++){
              if(num_float[i] == '.'){
                  point_pos = i;
                  break;
              }
          }
          num_float.erase(point_pos,1);//earse .
          //reverse num
          string ans;
          ans.resize(5,0);
          for(int i = 0;i<5;i++){
              ans[i] = num_float[4-i] - '0';
          }
          num_float = ans;
          int l = 5;
          for(int i = 0; i < n-1;i++){
              string tmp;
              tmp.resize(1024,0);
              tmp = ans;
              
              ans = "";
              ans.resize(1024,0);
            
              for(int j = 0;j<5;j++){
                  for(int k = 0;k<l;k++){
                    ans[j+k] += num_float[j] * tmp[k];
                    if(ans[j+k] >= 10){
                    	if(j+k == l+3)
							continue;
						ans[j+k+1] += ans[j+k] / 10;
						ans[j+k] = ans[j+k] % 10;	
					}                    		
                  }
              }
              
			  while(ans[l+3] >= 10){
			  	ans[l+4] += ans[l+3]/10;
			  	ans[l+3] = ans[l+3]%10;
			  	l++;
				}
			  
			  l += 4;
          }

          ans.insert(n*(5-point_pos), 1, '.');
          
          //find start
          int start = l;
          while(ans[start] == 0) start--;

          //find end
          int end = 0;
          while(ans[end] == 0) end ++;
          if(ans[end] == '.') end++;
		  
          for(int i = start; i>= end;i--){
            if(ans[i] != '.')
				cout << ans[i] + 0;
			else
				cout << '.';              
		 }
		 cout << endl; 
      }

      return 0;
  } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值