华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1511|回复: 5
打印 上一主题 下一主题

P2142 高精度减法

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2018-7-3 16:40:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
https://www.luogu.org/problemnew/show/P2142
输入输出格式
输入格式:
两个整数a,b(第二个可能比第一个大)

输出格式:
结果(是负数要输出负号)

输入输出样例
输入样例#1:
2
1
输出样例#1:
1
说明
20%数据a,b在long long范围内

100%数据0<a,b<=10的10000次方
回复

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
6#
发表于 2018-8-25 17:47:57 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. string s1,s2;
  4. int a[10005],b[10005],c[10005],l1,l2;
  5. int main()
  6. {
  7.     cin>>s1>>s2;
  8.     l1=s1.size();
  9.     l2=s2.size();
  10.     if(l1<l2||(l1==l2&&s1<s2))
  11.     {
  12.         cout<<'-';
  13.         swap(s1,s2);
  14.         swap(l1,l2);
  15.     }
  16.     int mx=max(l1,l2);
  17.     for(int i=1;i<=l1;i++)a[i]=s1[l1-i]-'0';
  18.     for(int i=1;i<=l2;i++)b[i]=s2[l2-i]-'0';
  19.     for(int i=1;i<=mx;i++)
  20.     {
  21.         c[i]+=a[i]-b[i];
  22.         c[i+1]--;
  23.         c[i]+=10;
  24.         c[i+1]+=c[i]/10;
  25.         c[i]%=10;
  26.     }
  27.     int l=mx+1;
  28.     while(l>1&&!c[l])l--;
  29.     for(int i=l;i>=1;i--)cout<<c[i];
  30.     return 0;
  31. }
复制代码
回复 支持 反对

使用道具 举报

14

主题

106

帖子

317

积分

中级会员

Rank: 3Rank: 3

积分
317
5#
发表于 2018-7-23 23:32:36 | 只看该作者
高精度减法常规,用时1h,不好,--顺手写成了++
  1. #include<iostream>
  2. using namespace std;
  3. string n,n1,n2;
  4. int a[10010],b[10010],c[10010],la,lb,lc,i;
  5. int bj(string x,string y)
  6. {
  7.     for(i=0;i<=la;i++)
  8.     {
  9.         if(x[i]>y[i]) return 0;
  10.         if(x[i]<y[i]) return 1;
  11.     }
  12.     return 0;
  13. }
  14. int main()
  15. {
  16.     cin>>n1>>n2;
  17.     la=n1.size();lb=n2.size();
  18.     if(la<lb)
  19.         {swap(n1,n2);swap(la,lb);cout<<'-';}
  20.     else if(la==lb&&bj(n1,n2))
  21.         {swap(n1,n2);swap(la,lb);cout<<'-';}
  22.     if(la>lb) for(i=lb;i<la;i++) n2=n2+'0';
  23.     for(i=0;i<=la-1;i++) a[la-i]=n1[i]-'0';
  24.     for(i=0;i<=lb-1;i++) b[lb-i]=n2[i]-'0';
  25.     i=1;while(i<=la)
  26.     {
  27.         if(a[i]<b[i]){a[i]+=10;a[i+1]--;}
  28.         c[i]=a[i]-b[i];i++;
  29.     }
  30.     lc=i;
  31.     while(c[lc]==0&&lc>1) lc--;
  32.     for(i=lc;i>=1;i--) cout<<c[i];
  33.     return 0;
  34. }
复制代码
回复 支持 反对

使用道具 举报

4

主题

21

帖子

89

积分

注册会员

Rank: 2

积分
89
地板
发表于 2018-7-19 22:13:57 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. string s1,s2,s3;
  4. int l1,l2,i,j,k,x3;
  5. int main()
  6. {
  7.     cin>>s1>>s2;
  8.     bool b1=s1.size()<s2.size();
  9.     bool b2=(s1.size()==s2.size()&&s1<s2);
  10.     if((b1||b2))
  11.     {
  12.         swap(s1,s2);
  13.         cout<<'-';
  14.     }
  15.     l1=s1.size();
  16.     l2=s2.size();
  17.     for(i=1; i<=l1-l2; i++) s2='0'+s2;
  18.     j=0;
  19.     s3="";
  20.     for(i=l1-1; i>=0; i--)
  21.     {
  22.         x3=s1[i]-s2[i]-j;
  23.         if(x3<0)
  24.         {
  25.             x3+=10;
  26.             j=1;
  27.         }
  28.         else j=0;
  29.         s3=char(x3+'0')+s3;
  30.     }
  31.     while(s3[0]=='0'&&s3.size()>1)
  32.         s3.erase(0,1);
  33.     cout<<s3;
  34.     return 0;
  35. }
复制代码
回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
板凳
发表于 2018-7-18 17:57:35 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int a[10010],b[10010],ans[10010];
  4. int n;
  5. string s1,s2;
  6. bool flag;
  7. void zs()
  8. {
  9.         int i;
  10.         for(i=1;i<=s1.size();i++)
  11.         ans[i]=a[i]-b[i];
  12.         for(i=1;i<=s1.size();i++)
  13.         {
  14.                 while(ans[i]<0)
  15.                 {
  16.                         ans[i]+=10;
  17.                         ans[i+1]--;
  18.                 }
  19.         }
  20.         for(i=s1.size();ans[i]==0;i--)if(i==0)break;
  21.         n=i;if(n==0)n++;
  22.         for(int i=n;i>=1;i--)
  23.         cout<<ans[i];
  24.         return;
  25. }
  26. void fs()
  27. {
  28.         int i;
  29.         for(i=1;i<=s2.size();i++)
  30.         ans[i]=b[i]-a[i];
  31.         for(i=1;i<=s2.size();i++)
  32.         {
  33.                 while(ans[i]<0)
  34.                 {
  35.                         ans[i]+=10;
  36.                         ans[i+1]--;
  37.                 }
  38.         }
  39.         for(i=s2.size();ans[i]==0;i--)continue;
  40.         n=i;cout<<"-";
  41.         for(int i=n;i>=1;i--)
  42.         cout<<ans[i];
  43.         return;
  44. }
  45. int main()
  46. {
  47.         cin>>s1;
  48.         cin>>s2;
  49.         for(int i=0;i<s1.size();i++)
  50.         a[s1.size()-i]=s1[i]-'0';
  51.         for(int i=0;i<s2.size();i++)
  52.         b[s2.size()-i]=s2[i]-'0';
  53.         if(s1.size()<s2.size())
  54.         fs();
  55.         if(s1.size()>s2.size())
  56.         zs();
  57.         if(s1.size()==s2.size())
  58.         {
  59.                 for(int i=1;i<s1.size();i++)
  60.              {
  61.                 if(a[i]>b[i])
  62.                 {
  63.                         flag=0;
  64.                         break;
  65.                 }
  66.                 if(a[i]<b[i])
  67.                 {
  68.                         flag=1;
  69.                             break;
  70.                     }
  71.             }
  72.             if(flag==0)zs();
  73.             else fs();
  74.         }
  75.         /*for(int i=1;i<=s1.size();i++)
  76.         cout<<a[i];
  77.         cout<<endl;
  78.         for(int i=1;i<=s2.size();i++)
  79.         cout<<b[i];*/
  80.        
  81.         return 0;
  82. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
沙发
 楼主| 发表于 2018-7-11 20:21:25 | 只看该作者
  1. #include <iostream>
  2. using namespace std;
  3. string s1,s2,s3;
  4. int l1,l2,i,j,k,x1,x2,x3;
  5. char ch3;
  6. int main()
  7. {
  8.     cin>>s1>>s2;
  9.     l1=s1.size();
  10.     l2=s2.size();
  11.     if ((l1<l2)||(l1==l2 && s1<s2))
  12.     {
  13.         swap(s1,s2);    ///短的放后面
  14.         swap(l1,l2);
  15.         cout<<'-';
  16.     }
  17.     ///cout<<s1<<endl<<s2<<endl;///检查
  18.     for(i=1; i<=l1-l2; i++) s2='0'+s2;
  19.     ///cout<<s1<<endl<<s2<<endl;///再检查

  20.     ///开始加
  21.     s3="";
  22.     j=0;
  23.     for (i=l1-1; i>=0; i--) ///从右往左
  24.     {
  25.         x1=s1[i]-'0';///把第i位的字符转成数字
  26.         x2=s2[i]-'0';
  27.         x3=x1-x2-j;///不要忘记了进位
  28.         if (x3<0)  ///进位处理
  29.         {
  30.             x3=x3+10;
  31.             j=1;
  32.         }
  33.         else j=0;
  34.         ch3=x3+'0';///数字转字符
  35.         s3=ch3+s3;///接在s3前面
  36.     }
  37.     while (s3[0]=='0' && s3.size()>1) s3.erase(0,1) ;
  38.     cout<<s3;
  39.     return 0;
  40. }
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 00:37 , Processed in 0.110885 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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