求高精度幂

来源:互联网 发布:react.js 中文文档 编辑:程序博客网 时间:2024/06/06 09:46

求高精度幂

时间限制:3000 ms  |  内存限制:65535 KB
难度:2
描述

对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。 

现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R  n 次方(Rn),其中是整数并且 0 < =n <= 25

输入
输入有多行,每行有两个数R和n,空格分开。R的数字位数不超过10位。
输出
对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。
样例输入
95.123 120.4321 205.1234 156.7592  998.999 101.0100 12
样例输出
548815620517731830194541.899025343415715973535967221869852721.0000000514855464107695612199451127676715483848176020072635120383542976301346240143992025569.92857370126648804114665499331870370751166629547672049395302429448126.76412102161816443020690903717327667290429072743629540498.1075960194566517745610440100011.126825030131969720661201
来源
POJ
上传者

            iphxer

原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=155

思路:主要用大数的乘法运算,先把小数r[]乘以十的方法转化为整数t存入,t乘以R[]中的每一位数取余再存入 数组R[]中,

保留进位加到下一位中(大数相乘步骤自己理解),输出时记好小数点的位置 

#include<stdio.h>  #include<string.h>  int main()  {      int i, j, n, doc, ans[200]; //doc是逗号后面实际的位数      char s[20];      while( scanf( "%s %d", s, &n ) == 2 ){          if( n == 0 )//幂为0时结果为1 {            printf( "1\n");              continue;          }          memset( ans, 0, sizeof(ans) );           int len = strlen(s);           int real = 0;//是去掉小数点之后的实际整数          int flag1 = 1;//标记前面不是0的数          int flag = 0; //标记逗号出现           doc = 0;          int k = 0;          int sum = 0; //sum是小数点后面没有作用的0的个数          for( i = 0; i < len; i ++ )  if( s[i] == '.'){  flag = 1;  break;  }  if( flag ){ //如果有逗号   for( i = len-1; i >= 0; i -- ){  if( s[i] == '0'&&flag1 ){  ++sum;continue;  }  else{   flag1 = 0;  if( s[i] == '.' ){  doc = len-i-sum-1;  //标记小数点的位置 continue; }   }  ans[k++] = s[i]-'0';  }  }   else{ //如果没逗号  for( i = len-1; i >= 0; i -- ){  ans[k++] = s[i]-'0';}}for( i = k-1; i >=0; i -- )  real = real*10+ans[i];  for( i = 1; i < n; i ++ )  //核心代码 {  int c = 0;   //临时结果进位的值初始化为0 for( j = 0; j < 199; j ++ ) //遍历整个数组计算每一位与底数相乘的结果相加存入数组{  int s = ans[j]*real+c;  //计算每一位与底数相乘的临时结果ans[j] = s%10;  //临时结果取余存入数组c = s/10;  //进位的值}  }  for( i = 199; ans[i]==0&&i>=n*doc; i -- ); //查找小数点的位置,如果不存在小数点不为0的数为首位置 for( j = i; j >= 0; j -- )//逆序从最低位逐个输出{  if( j == n*doc-1 )//放入小数点printf( "." );  printf( "%d", ans[j] );   }  printf( "\n" );      }      return 0;  }


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脚痒还有小泡泡怎么办 外阴长了肉疙瘩怎么办 嘴巴里泡泡破了怎么办 脚上泡泡破了怎么办 脸被自己扣破了怎么办 6s安装不了软件怎么办 苹果6s特别卡怎么办 苹果手机4g网慢怎么办 大王卡玩王者卡怎么办 荣耀7c手机卡顿怎么办 华为6x手机卡顿怎么办 荣耀7c手机老卡怎么办 苹果6打王者卡怎么办 电脑玩游戏显示显卡不行怎么办 笔记本玩游戏显卡不行怎么办 笔记本玩英雄联盟有点卡怎么办 英语考试作文抄了阅读理解怎么办 qq账号被盗怎么办很久了 想玩线上德州没有渠道怎么办 手机玩久了头晕怎么办 玩3d游戏头晕恶心怎么办 win10打cf没声音怎么办 英雄联盟玩家尚未准备就绪怎么办 玩手机想吐应该怎么办 玩手机多了头晕怎么办 玩cf老是无响应怎么办 玩穿越火线好卡怎么办 绝地求生画质卡顿怎么办 手机热点玩lol卡怎么办 一加6直播触手黑屏怎么办 ipad应用商店密码忘记了怎么办 爱派忘记了密码怎么办 爱派id密码忘了怎么办 爱派密码忘了怎么办 爱派的密码忘了怎么办 苹果爱派密码忘了怎么办 鼠标无法识别的usb设备怎么办 电脑鼠标无法识别usb设备怎么办 win7电脑用户密码忘了怎么办 联想win7旗舰版开不了机怎么办 驱动都被卸载了怎么办