。。。
...快睡觉吧 好吧,全文一点注释都没有{:10_269:} 第八句是什么意思?
string num1(a),num2(b);
第一次看见这种语法{:10_257:} 把加减乘除都实现啦{:10_257:}
我给你悄悄说一声,我只会加减,不会乘除{:10_250:} 不得不说你的代码的常数因子是真的大{:10_257:} {:5_106:} zhangjinxuan 发表于 2023-7-22 10:27
不得不说你的代码的常数因子是真的大
是这样的,因为是我自己想的
元豪 发表于 2023-7-22 07:35
第八句是什么意思?
string num1(a),num2(b);
应该是初始化为括号里面的字符串吧 zhangjinxuan 发表于 2023-7-22 10:26
把加减乘除都实现啦
我给你悄悄说一声,我只会加减,不会乘除
kkksc003是这样说的:
可以将a[ i ]*b[ j ]的贡献全都在中间产物的第 i+j-1 位上,可以把所有贡献算出来,最后一口气处理所有进位问题,代码很长,展示部分for (int i = 1;i <= lena;i++)
for(int j =1;j<= lenb;j++)
c += a*b//计算贡献
@额外减小 不知道是否有帮助 sfqxx 发表于 2023-7-22 21:01
kkksc003是这样说的:
可以将a[ i ]*b[ j ]的贡献全都在中间产物的第 i+j-1 位上,可以把所有贡献算 ...
乘法我就是按这个算法做的。 @@zhangjinxuan 你觉得我的加减部分效率如何?
inline int gjd_cmp(string a,string b)//a>b:return 1 a==b:return 0 a<b:return -1
{//比较大小,不解释
string num1(a),num2(b);
while(num1=='0' and num1.length()-1)
{
num1.erase(0,1);
}
while(num2=='0' and num2.length()-1)
{
num2.erase(0,1);
}
if(num1.length()<num2.length())
{
return -1;
}
if(num1.length()>num2.length())
{
return 1;
}
for(int i=0,l=num1.length();i<l;i++)
{
if(num1>num2)
{
return 1;
}
if(num1<num2)
{
return -1;
}
}
return 0;
}
inline string gjd_add(string a,string b)
{
int sum=0;
string ans,num1(a),num2(b);
if(num1.length()>num2.length())//补全位数
{
num2.insert(0,num1.length()-num2.length(),'0');
}
else
{
num1.insert(0,num2.length()-num1.length(),'0');
}
for(int i=num1.length()-1;i>=0;i--)
{
sum+=num1+num2-2*'0';
ans.insert(0,1,sum%10+'0');//进位
sum/=10;
}
if(sum)ans.insert(0,1,sum+'0');
return ans;
}
inline string gjd_sub(string a,string b)//有去除前导零
{
int jw=0,op=0;
string num1,num2,ans;//num1>num2
if(gjd_cmp(a,b)>=0)num1=a,num2=b;
else num1=b,num2=a,op=1;//num2 为减数,num1 为被减数
num2.insert(0,num1.length()-num2.length(),'0');
for(int i=num1.length()-1;i>=0;i--)
{
if(num1<num2+jw)
{
ans.insert(0,1,num1+10-num2-jw+'0');
jw=1;
}
else
{
ans.insert(0,1,num1-num2-jw+'0');
jw=0;
}
}
for(int i=0;i<ans.length();i++)
{
if(ans!='0')
{
ans.erase(0,i);
break;
}
}
if(ans=='0')ans="0";
if(op)ans.insert(0,1,'-');
return ans;
}
页:
1
[2]