带小数点数值的极大次方求解

2024-08-22 09:32

本文主要是介绍带小数点数值的极大次方求解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自 http://blog.csdn.net/rually/article/details/8585268
http://poj.org/problem?id=1001

原题如下: 
Exponentiation
Time Limit: 500MS Memory Limit: 10000K
Total Submissions: 113486 Accepted: 27528

Description

Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a taxing experience for many computer systems.

This problem requires that you write a program to compute the exact value of R n where R is a real number ( 0.0 < R < 99.999 ) and n is an integer such that 0 < n <= 25.

Input

The input will consist of a set of pairs of values for R and n. The R value will occupy columns 1 through 6, and the n value will be in columns 8 and 9.

Output

The output will consist of one line for each line of input giving the exact value of R^n. Leading zeros should be suppressed in the output. Insignificant trailing zeros must not be printed. Don't print the decimal point if the result is an integer.

Sample Input

95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12

Sample Output

548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
 
题目要求求出浮点数的高精度结果,不限制保留小数点之后几位,所以,需将小数点之后的所有结果,全部求出,代码如下: 
[cpp]  view plain copy
  1. #include<iostream>  
  2. using namespace std;  
  3. #define MAX 150  
  4.   
  5. int  first[MAX],second[MAX];  
  6.   
  7.   
  8.  void pow(char base[],int n)  //base 有效数字  
  9.  {  
  10.   
  11.   
  12. int k=0;  
  13.     int point=-1;//小数点的位置  
  14.  int tmp[MAX];//存放临时乘积   
  15.   
  16.   
  17.       //初始化 为0  
  18.   for(int i=0;i<MAX;i++ )  
  19.   {  
  20.       first[i]=second[i]=0;  
  21.   }  
  22.    
  23.       //将输入的底数反过来存入first second   
  24.   for( i=5;i>=0;i--)  
  25.   {  
  26. if(base[i]!='.')  
  27. {  
  28. first[k]=second[k++]=base[i]-'0';  
  29. }  
  30. else  //记录小数点的位置  
  31. {  
  32.   point=5-i;  // 小数点后面有几位数字   
  33. }    
  34.   }  
  35.   point=point*n;  
  36. //乘方 乘n-1次  first 里面存放的是每次乘方的结果   core  
  37.  for(i=0;i<n-1;i++)  
  38.  {  
  39. //每次乘方前需要将存放临时结果的tmp清0  
  40.        for(int j=0;j<MAX;j++)  
  41. {  
  42.     tmp[j]=0;  
  43. }  
  44.   
  45.   
  46. //开始乘方  
  47.       for( j=0;j<6*(i+1);j++) ///   first[j] 数字地一次有效位数5  平方变成10位15 ,20位。。。。  
  48.   {  
  49.         for(int k=0;k<6;k++)  //second[k]  
  50. {  
  51.      tmp[j+k]+=first[j]*second[k];      //core 结果逐位的乘原数    j表示错位    
  52. }  
  53.   }  
  54.   //进位  
  55.   
  56.   
  57.            for(k=0;k<5*(i+2); k++)  
  58.   {  
  59.        if(tmp[k]>9)  
  60. {  
  61.     tmp[k+1]+=(int)(tmp[k]/10);  
  62.     tmp[k]=tmp[k]%10;   
  63. }  
  64.   
  65.   
  66. //tmp付给first  
  67. first[k]=tmp[k];  
  68.   }  
  69.     
  70.  } //end 乘方  
  71.                //计算出有效数位的长度   
  72.    //将数字的前面和后面的小数点去掉   
  73.  int back=0,front=point ;  
  74.             for( i=0;i<point;i++)  //后面的输出截止点  
  75. {  
  76.      if(first[i]!=0)  
  77.  {  
  78.     back=i;  
  79. break;  
  80.  }  
  81. }  
  82. for(i=5*n-1;i>=point;i--)  //前面的输出起点  
  83. {  
  84.     if(first[i]!=0)  
  85. {  
  86.     front=i;  
  87. break;  
  88. }  
  89. }  
  90.   
  91. //将计算结果打印出来  
  92. for(int ii=front;ii>=back;ii--)  
  93. {  
  94. if( ii==point)// 因为是从最右边开始 所以的到ii的时候说明右面还剩ii位数字   
  95. {  
  96.    if(first[ii]!=0)  
  97. {  
  98. cout<<first[ii]<<".";  
  99. }  
  100. else cout<<".";  
  101. }  
  102.    
  103. else   cout<<first[ii];  
  104. }      
  105.  }  
  106.   
  107.   
  108.  int main()  
  109.  {   
  110.    char a[7]="0.4321"//【6】会错误  最后还需一个“ ”  
  111.    int n=20;  
  112.    pow(a,n);  
  113.    return 0;  
  114.  }  


注意;两个数在没有小数点的情况下竖式错位相乘,是解决本题的关键
for( j=0;j<6*(i+1);j++) ///   first[j] 数字地一次有效位数5  平方变成10位15 ,20位。。。。
    {
         for(int k=0;k<6;k++)  //second[k]
         {
                tmp[j+k]+=first[j]*second[k];      //core 结果逐位的乘原数    j表示错位  
         }
   }

转自 http://blog.csdn.net/rually/article/details/8585268

这篇关于带小数点数值的极大次方求解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095888

相关文章

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区

交换两个变量数值的3种方法

前言:交换两个数值可不是"a = b,b = a"。这样做的话,a先等于了b的值;当“b = a”后,因为此时a已经等于b的值了,这个语句就相当于执行了b = b。最终的数值关系就成了a == b,b == b。 下面教给大家3种交换变量数值的方法: 目录 1. 中介法 2. 消和法 3. 异或法 4. 总结 1. 中介法 中介法(又称 临时变量法 或 酱油法),其中心

JavaScript中使用正则判断一个值是否是数字,包含正负,小数点

使用正则表达式来判断: if(/^[+-]?\d*\.?\d*$/.test(str)){//为数字} 实际情况中可以将+去掉,

基于SA模拟退火算法的多车辆TSP问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述        基于SA模拟退火算法的多车辆TSP问题求解matlab仿真,三个车辆分别搜索其对应的最短路径,仿真后得到路线规划图和SA收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 (完整程序运行后无水印)

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

JD 1147:Jugs(一种用最少步骤求解的方法)

OJ题目:click here~~ 题目分析:九度上这道没有要求最少步数,只要得到最后结果即可AC , bfs , dfs都行。最少步骤的方法肯定也能AC啦,分析如下。 输入的三个数:a,b,n;> 由题不定方程ax+by=n必定有解> 如果b=n,则fill B即可,否则用试探法求出这样的两组解(a1,b1)及(a2,b2),其中a1 >0,b1<0;a1是满足方程的最小正整数;a2

【2024全国大学生数学建模竞赛】B题 模型建立与求解(含代码与论文)

目录 1问题重述1.1问题背景1.2研究意义1.3具体问题 2总体分析3模型假设4符号说明(等四问全部更新完再写)5模型的建立与求解5.1问题一模型的建立与求解5.1.1问题的具体分析5.1.2模型的准备 目前B题第一问的详细求解过程以及对应论文部分已经完成! - 晚上7-8点之前第二问完成 - 明天中文之前全部写完 按照提交论文的格式进行撰写!完整版请看文章最后!

Java 快速求解x的x次幂结果为10

1.问题描述 如果x的x次幂结果为10(如图所示),你能计算出x的近似值吗? 显然,这个值是介于2和3之间的一个数字。 可以使用牛顿迭代公式进行求解,因为是逼近算法可以大大减少运算次数 public static void main(String[] args) {int i = 0;double x1 = 2.5;while (true) {i++;//x^x - 10 = 0//这一步

鸿蒙图表MPChart自定义样式(五)左y轴显示数值,右y轴显示百分比

左y轴数值不变,右y轴改成百分比,需要通过自定义RightAxisFormatter实现IAxisValueFormatter接口,将右y轴的数值改成百分比文本,RightAxisFormatter类如下: class RightAxisFormatter implements IAxisValueFormatter {maxNumber: number = 0;constructor(ma

(转)mysql按字段排序 按照字段的数值大小排序,而非 ascii码排序

参考:http://www.cnblogs.com/codefly-sun/p/5898738.html     如果是varchar类型, 排序后是这样的: 就是对mysql数值字符串类型进行排序,在默认情况下使用order by 字段名称 desc/asc 进行排序的时候,mysql进行的排序规则是按照ASCII码进行排序的,并不会自动的识别出这些数据是数值   ,百度了一下,