鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 额外减小

[已解决]高精度求助

[复制链接]
 楼主| 发表于 2023-7-22 01:46:57 | 显示全部楼层

...快睡觉吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 07:34:31 | 显示全部楼层
好吧,全文一点注释都没有
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 07:35:47 | 显示全部楼层
第八句是什么意思?

string num1(a),num2(b);

第一次看见这种语法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 10:26:32 | 显示全部楼层
把加减乘除都实现啦

我给你悄悄说一声,我只会加减,不会乘除
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 10:27:22 | 显示全部楼层
不得不说你的代码的常数因子是真的大
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 14:26:30 | 显示全部楼层

回帖奖励 +1 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-22 14:27:42 | 显示全部楼层
zhangjinxuan 发表于 2023-7-22 10:27
不得不说你的代码的常数因子是真的大

是这样的,因为是我自己想的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-22 14:30:58 | 显示全部楼层
元豪 发表于 2023-7-22 07:35
第八句是什么意思?

string num1(a),num2(b);

应该是初始化为括号里面的字符串吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 21:01:45 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +1 鱼币

zhangjinxuan 发表于 2023-7-22 10:26
把加减乘除都实现啦

我给你悄悄说一声,我只会加减,不会乘除

kkksc003是这样说的:  

可以将a[ i ]*b[ j ]的贡献全都在中间产物的第 i+j-1 位上,可以把所有贡献算出来,最后一口气处理所有进位问题,代码很长,展示部分
  1. for (int i = 1;i <= lena;i++)
  2.     for(int j =1;j<= lenb;j++)
  3.         c[i+j-1] += a[i]*b[i]//计算贡献

复制代码


@额外减小 不知道是否有帮助
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-22 21:12:39 | 显示全部楼层
sfqxx 发表于 2023-7-22 21:01
kkksc003是这样说的:  

可以将a[ i ]*b[ j ]的贡献全都在中间产物的第 i+j-1 位上,可以把所有贡献算 ...

乘法我就是按这个算法做的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-22 22:10:34 | 显示全部楼层
@@zhangjinxuan 你觉得我的加减部分效率如何?

  1. inline int gjd_cmp(string a,string b)//a>b:return 1   a==b:return 0   a<b:return -1
  2. {//比较大小,不解释
  3.         string num1(a),num2(b);
  4.         while(num1[0]=='0' and num1.length()-1)
  5.         {
  6.                 num1.erase(0,1);
  7.         }
  8.         while(num2[0]=='0' and num2.length()-1)
  9.         {
  10.                 num2.erase(0,1);
  11.         }
  12.         if(num1.length()<num2.length())
  13.         {
  14.                 return -1;
  15.         }
  16.         if(num1.length()>num2.length())
  17.         {
  18.                 return 1;
  19.         }
  20.         for(int i=0,l=num1.length();i<l;i++)
  21.         {
  22.                 if(num1[i]>num2[i])
  23.                 {
  24.                         return 1;
  25.                 }
  26.                 if(num1[i]<num2[i])
  27.                 {
  28.                         return -1;
  29.                 }
  30.         }
  31.         return 0;
  32. }

  33. inline string gjd_add(string a,string b)
  34. {
  35.         int sum=0;
  36.         string ans,num1(a),num2(b);
  37.         if(num1.length()>num2.length())//补全位数
  38.         {
  39.                 num2.insert(0,num1.length()-num2.length(),'0');
  40.         }
  41.         else
  42.         {
  43.                 num1.insert(0,num2.length()-num1.length(),'0');
  44.         }
  45.         for(int i=num1.length()-1;i>=0;i--)
  46.         {
  47.                 sum+=num1[i]+num2[i]-2*'0';
  48.                 ans.insert(0,1,sum%10+'0');//进位
  49.                 sum/=10;
  50.         }
  51.         if(sum)ans.insert(0,1,sum+'0');
  52.         return ans;
  53. }

  54. inline string gjd_sub(string a,string b)//有去除前导零
  55. {
  56.         int jw=0,op=0;
  57.         string num1,num2,ans;//num1>num2
  58.         if(gjd_cmp(a,b)>=0)num1=a,num2=b;
  59.         else num1=b,num2=a,op=1;//num2 为减数,num1 为被减数
  60.         num2.insert(0,num1.length()-num2.length(),'0');
  61.         for(int i=num1.length()-1;i>=0;i--)
  62.         {
  63.                 if(num1[i]<num2[i]+jw)
  64.                 {
  65.                         ans.insert(0,1,num1[i]+10-num2[i]-jw+'0');
  66.                         jw=1;
  67.                 }
  68.                 else
  69.                 {
  70.                         ans.insert(0,1,num1[i]-num2[i]-jw+'0');
  71.                         jw=0;
  72.                 }
  73.         }
  74.         for(int i=0;i<ans.length();i++)
  75.         {
  76.                 if(ans[i]!='0')
  77.                 {
  78.                         ans.erase(0,i);
  79.                         break;
  80.                 }
  81.         }
  82.         if(ans[0]=='0')ans="0";
  83.         if(op)ans.insert(0,1,'-');
  84.         return ans;
  85. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-10 02:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表