草庐IT

高精度

chanxe 2023-03-28 原文

高精度

运算:加法、减法、阶乘、乘法

翻转:

这些运算都是从小位开始,所以一般需要翻转。以字符串储存:reverse(a.begin(),a,end())。以数组储存:

 for (int i1 = lena1 - 1; i1 >= 0; i1--) {
  a1[lena1-1-i1] = a[i1] - '0';
  }
进位、借位:

加法、减法:

 for(int k=0;k<ll+1;k++){//进位运算 
  if(ans[k]>'9'){
  ans[k]-=10;
  ans[k+1]++;
  }
  }
         for(int k=0;k<ll;k++){//借位运算 
  if(ans[k]<'0'){
  ans[k]+=10;
 // cout<<ans[k];
  ans[k+1]--;
  }
  }

乘法:

 if(a[i]>=10)
                {
                     a[i+1]+=a[i]/10;
                     a[i]%=10;
                }
                 a[i]*=N;

具体题目:

P1120 大整数加法

题目描述

给出两个 200 位以内的正整数,求其和。

输入描述

多组测试数据。每组测试数据包括两行,每行一个数。

输出描述

每组测试输出一行,为所求两个整数之和。

样例输入

123

456

样例输出

579

 #include<iostream>
 #include<string>
 #include<algorithm>
 using namespace std;
 
 int main(){
  string a,b;
  while(cin>>a>>b){
  string ans;
  int aa = a.length();//字符串a长度
  int bb = b.length();//字符串b长度
  int ss = min(aa,bb);//最小长度
  int ll = max(aa,bb);//最大长度
  reverse(a.begin(), a.end());//将字符串翻转用于从小位开始计算
  reverse(b.begin(), b.end());
 
  for(int i=0;i<ss;i++)
  ans+= a[i]+b[i]-'0';//相同位数之间计算
  if(aa>bb)//将大位数单独加在字符串尾部
  {
  for(int j=ss;j<aa;j++)
  ans+= a[j];}//将
  else if(bb>aa)
  for (int j=ss;j<bb;j++)
  ans+= b[j];
  ans+='0';//用于最大位进位
  for(int k=0;k<ll+1;k++){//进位运算
  if(ans[k]>'9'){
  ans[k]-=10;
  ans[k+1]++;
  }
  }
  reverse(ans.begin(),ans.end());//翻转为正常顺序
  for(int i=ans.find_first_not_of('0');i<ll+1;i++){//找到第一位不为0的位置,一次输出
  if(i==-1){
  cout<<0;
  return 0;
  }
  cout<<ans[i]-48;
  }
  cout<<endl;
  }
  return 0;
 
 }
P1121 大整数减法

题目描述

给出两个 200 位以内的正数,算出第一个数减第二个数的值(结果为正)。

输入描述

每组测试数据包括两行,第一行为被减数,第二行为减数。

输出描述

每组测试数据输出一行,为所求两个整数之差。

样例输入

987

654

样例输出

333

 #include<iostream>
 #include<string>
 #include<algorithm>
 using namespace std;
 
 int main(){
  string a,b,temp;
  int flag = 0;
  while(cin>>a){
  cin>>b;
  string ans;
  int aa = a.length();//字符串a长度
  int bb = b.length();//字符串b长度
  int ss = min(aa,bb);//最小长度
  int ll = max(aa,bb);//最大长度
  reverse(a.begin(), a.end());//将字符串翻转用于从小位开始计算
  reverse(b.begin(), b.end());
  if(aa==bb){
  if(b>a){
  temp = a;
  a = b;
  b = temp;
  flag = 1;
  }
  }
  else if(bb>aa){
  temp = a;
  a = b;
  b = temp;
  aa = bb;
  flag = 1;
  }
  for(int i=0;i<ss;i++)
  ans+= a[i]-b[i]+'0';//相同位数之间计算
  for(int j=ss;j<ll;j++)
  ans+= a[j];
  for(int k=0;k<ll;k++){//借位运算
  if(ans[k]<'0'){
  ans[k]+=10;
 // cout<<ans[k];
  ans[k+1]--;
  }
  }
  reverse(ans.begin(),ans.end());//翻转为正常顺序
  if(flag) cout<<'-';
  for(int i=ans.find_first_not_of('0');i<ll;i++){//找到第一位不为0的位置,一次输出
 
  cout<<ans[i]-48;
  }
  cout<<endl;
  }
  return 0;
 
 }
P1134 高精度阶乘

题目描述

求一个非负整数 N 的阶乘的精确值(N 的大小保证 N 的阶乘不超过 3000 位)。

输入描述

有多组测试数据,每组测试数据包含一行非负整数 N。

输出描述

对于每组测试数据,输出一行答案。

样例输入

3

10

50

样例输出

6

3628800

30414093201713378043612608166064768844377641568960512000000000000

 #include<bits/stdc++.h>
 using namespace std;
 //对每一位进行数字乘法,处理好进位
 int main()
 {
     int N;
     while(cin>>N)
    {
         int a[3001]={0};
         int i=0;
         a[0]=1;
         while(N)
        {
             for(i=0;i<3001;i++)
            {
                 if(a[i]>=10)
                {
                     a[i+1]+=a[i]/10;
                     a[i]%=10;
                }
                 a[i]*=N;
            }
             N--;
        }
         while(a[i]==0)
        {
             i--;
        }
         for(;i>=0;i--)
             cout<<a[i];
         cout<<endl;
    }
     return 0;
 }
P1136 高精度乘法

题目描述

给出两个长度小于 100 位的正整数,求其乘积。

输入描述

两行,一行一个数。

输出描述

一行,为所求乘积。

样例输入

1937

2931

样例输出

5677347

 #include<iostream> 
 #include<cstring>
 using namespace std;
 //将字符串每一位改为数字,再反向计算,最后处理进位问题。
 int main() {
  char a[101], b[101];       //定义字符数组是为了好测量,输入的长度
  while (cin >> a >> b) {
  char swap[101];         //用来进行交换的,超过a的长度小于b的长度
  int a1[101] = { 0 }, b1[101] = { 0 };  //接受a与b的,并将其转化为整形数组和反转
  int lena1, lenb1;      //测量a与b的长度
  lena1 = strlen(a), lenb1 = strlen(b);
  int n;                 //接受lena1与lena2的最大值,并且为下面的动态数组做准备
  n = (lena1 > lenb1 ? lena1 : lenb1);
  //申请动态数组,a与b的乘积最多有2*n位数
  int *p;
  p = new int[2 * n];
  //将p数组清零
  memset(p, 0, sizeof(int)*(2 * n));
  //控制b1为最短的数组
  if (lena1 < lenb1) {
  strcpy(swap, b);
  strcpy(b, a);
  strcpy(a, swap);
  }
  lena1 = strlen(a), lenb1 = strlen(b);
  //反转a数组
  for (int i1 = lena1 - 1; i1 >= 0; i1--) {
  a1[lena1-1-i1] = a[i1] - '0';
  }
  //反转数组b
  for (int k1 = lenb1 - 1; k1 >= 0; k1--) {
  b1[lenb1 - 1 - k1] = b[k1] - '0';
  }
  int len;    //控制p数组从第几位开始
  for (int i = 0; i < lenb1; i++) {
  len = i;
  for (int k = 0; k < lena1; k++) {
  p[len] += b1[i] * a1[k];
  if (p[len] > 9) {
  p[len + 1] += p[len] / 10;
  p[len] = p[len] % 10;
  }
  len++;
  }
  }
  while (p[len] == 0) {
  len--;
  }
  for (int k2 = len ; k2 >= 0; k2--) {
  cout << p[k2];
  }
  delete[]p;
  cout << endl;
  }
  return 0;
 }
 

有关高精度的更多相关文章

  1. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  2. ruby-on-rails - ruby on rails 模型验证中的浮点精度 - 2

    我正在尝试使用正则表达式验证美元金额:^[0-9]+\.[0-9]{2}$这工作正常,但每当用户提交表单并且美元金额以0(零)结尾时,ruby(或rails?)将0砍掉。所以500.00变成500.0,因此正则表达式验证失败。有没有办法让ruby​​/rails保持用户输入的格式,而不管尾随零? 最佳答案 我假设您的美元金额是小数类型。因此,用户在字段中输入的任何值在保存到数据库之前都会从字符串转换为适当的类型。验证适用于已转换为数字类型的值,因此在您的情况下,正则表达式并不是真正合适的验证过滤器。不过,您有几种可能性可以解决这个问

  3. ruby - Ruby 的任意精度算术 - 2

    Ruby到底是怎么做到的?Jörg或其他人是否知道幕后发生的事情?不幸的是,我不太了解C,所以bignum.c对我帮助不大。我只是有点好奇有人可以解释(用简单的英语)它使用的任何神奇算法背后的理论。irb(main):001:0>999**99936806348825922326789470084006052186583833823203735320465595962143702560930047223153010387361450517521869134525758989639113039318944796977164583238219236607653663113200177617

  4. ruby-on-rails - Rails 2.3.11 DateTime BigDecimal 精度 - 2

    我目前有一个运行Ruby1.8.7和Rails2.3.2的RubyonRails项目我有一些从数据库中读取数据的单元测试,特别是两个连续项目的日期时间列,这两个项目应该相隔24小时。在一项测试中,我将项目2的日期时间设置为与项目1的日期时间相同。当我执行断言以确保两个值相等时,测试在rails2.3.2下工作正常。当我升级到rails2.3.11时,测试失败显示两次之间的差异将关闭并出现以下错误:expectedbutwas.这两个版本的rails中似乎存在浮点转换问题。如何解决float问题? 最佳答案 这也发生在我身上,我最终这

  5. ruby-on-rails - Ruby float 学 - Sum Calc 中的精度问题 - 2

    大家早上好我在float学方面遇到了一些问题,完全迷失在“.to_f”、“*100”和“.0”中!我希望有人能帮助我解决我的具体问题,并准确解释他们的解决方案为何有效,以便我下次理解这一点。我的程序需要做两件事:对一组小数求和,确定它们的和是否正好为1.0确定1.0与数字总和之间的差值-将变量的值设置为使总和等于1.0的精确差值。例如:[0.28,0.55,0.17]->总和应为1.0,但我一直得到1.xxxxxx。我正在以下列方式实现总和:sum=array.inject(0.0){|sum,x|sum+(x*100)}/100我需要此功能的原因是我正在读取一组来自excel的小数。

  6. Ruby 浮点精度 - 2

    据我了解,Ruby(1.9.2)float的精度为15位十进制数字。因此,我希望将floatx舍入到小数点后15位将等于x。对于此计算,情况并非如此。x=(0.33*10)x==x.round(15)#=>false顺便说一句,四舍五入到16位返回true。你能给我解释一下吗? 最佳答案 部分问题是0.33在底层格式中没有精确的表示,因为它不能用一系列1/2n项来表示。因此,当它乘以10时,乘以的数字与0.33略有不同。就此而言,3.3也没有精确表示。第一部分当数字没有精确的10进制表示时,在转换尾数中有信息的最低有效位时会有余数。

  7. ruby - 如何以两位数的精度显示输出 - 2

    这是我的代码classAtmattr_accessor:amount,:rem,:balanceTAX=0.50deftransaction@rem=@balance=2000.00@amount=gets.chomp.to_fif@amount%5!=0||@balance我的输出是Enteramountfortransaction100#userentersthisvalueSuccessfulTransactionYourbalanceis1899.5如您所见,“您的余额为1899.5”的输出仅显示一位精度。我需要帮助来理解和解决问题。我希望输出有两位数的精度。还有我该如何改进这

  8. ruby - 设置Ruby中 float 的显示精度 - 2

    在Ruby中可以设置float的显示精度吗?类似于:z=1/3z.to_s#=>0.33333333333333z.to_s(3)#=>0.333z.to_s(5)#=>0.33333或者我是否必须覆盖Float的to_s方法? 最佳答案 z.round(2)或x.round(3)是最简单的解决方案。参见http://www.ruby-doc.org/core-1.9.3/Float.html#method-i-round.也就是说,这只会确保它不超过那么多位数。在1/3的情况下没问题,但如果你说0.25.round(3)你会得到0

  9. javascript - 数字的比例和精度 - 2

    我希望从以下示例中的数字中获取小数位数和精度。varx=1234.567;我没有看到任何内置的.scale或.precision函数,我不确定正确的最佳方法是什么。 最佳答案 您可以使用Number.prototype.toFixed()varx=1234.56780123;x.toFixed(2);//output:1234.57x.toFixed(3);//output:1234.568x.toFixed(4);//output:1234.5680 关于javascript-数字的比

  10. javascript - 如何将低精度数字(2-10 位)写入数组缓冲区/blob? - 2

    问题:在视频游戏中,有大量低精度数字可以通过网络打包在一起,与发送字符串相比可以显着节省带宽。字符串分配给每个字符使用1个字节的UTF-8。理想情况下,应该有一种方法可以将这些数字写在一起:playeridingame-precision0-1023range,10bits玩家轮换-四元数-经过一些数学简化后,一些数字最终为24位玩家输入-0-1范围x2,2位如何将这样的低精度数字放入数组缓冲区/blob中? 最佳答案 您可以使用Uint32Array,然后使用位移和掩码操作将值存储在该数组中。例如,如果您想存储一个4位数字,然后是

随机推荐