C++ 该死的高精度减法

  没看书直接硬上的结果是,一个简单的高精度减法我用了一个多小时只写了一个90分的代码。之前准备NOIP的时候确实是学了,可惜现在早就还给老师了。

结果回家一看标准程序,顿时有种想哭的赶脚。

  先上我的90分代码:

//高精度减法
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<vector>
#include<cstdio>
using namespace std;
string a,b;
int dif,dns=0;
vector<int>c;
void change(string x,string y)
{
    dif=abs(x.size()-y.size());
//    cout<<dif;
    int len=max(x.size(),y.size());
//    cout<<len;
    for(int i=len-1;i>=0;i--)
    {
//        cout<<"orz";
        int a=x[i]-‘0‘+dns,b=y[i-dif]-‘0‘;
        if(len-i > y.size()) {
//            cout<<"$$$$$$$$$$$$$$$$";
            b=0;
        }
        int p=a-b;
//        if(i==0) cout<<a<<endl<<b<<"orz";
//        cout<<a<<‘\t‘<<p<<‘\t‘;
        dns=0;
        if (p < 0) {
            if(i==0 && dif==0 ) {
                cout<<‘-‘;
                dns=0;
                c.resize(0);
                change(y,x);
                return;
            }
            p+=10;
            dns=-1;
        }
//        printf("%d____________\n",p);
//        cout<<p<<‘/‘;
        c.push_back(p);
    }
//    cout<<"|||||||||||||||"<<endl;;
    if(dif==1&&x[0]==‘0‘) return;

//    cout<<c.size()<<endl;
}
int main()
{
    cin>>a>>b;
    if (a.length() < b.length() ) {
        cout<<‘-‘;
        change(b,a);
    }
    else
    {
        change(a,b);
    }
//    cout<<c.size();
    for(int i=c.size()-1;i>=0;i--)
    {
//        cout<<"orz"<<i<<endl;
        cout<<c[i];
    }
    return 0;
}

里面充斥着大量d_bug的语句,见证着我的血与泪。这个代码错误的地方就在于我选择了string也就是字符串,这样的话比较大小上会很复杂,但是如果用char数组的话就没有这么麻烦了,直接用strcmp就可以搞定,可是苦逼的我当时就是没想到(咳咳!!好吧,其实我是想用string装逼来着)。

下面是用char写的代码:

时间: 2024-09-29 18:48:35

C++ 该死的高精度减法的相关文章

高精度减法

高精度减法(a-b)(a>b且a,b均为正整数) .从键盘读入两个正整数,求它们的差. 分析:类似加法,可以用竖式求减法.在做减法运算时,需要注意的是:被减数必须比减数大,同时需要处理借位.高精度减法的参考程序: 1 program exam2; 2 const 3 max=200; 4 var 5 a,b,c:array[1..max] of 0..9; 6 n,n1,n2:string; 7 lena,lenb,lenc,i,x:integer; 8 begin 9 readln(n1);

洛谷 P2142 高精度减法 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接 :https://www.luogu.org/problem/show?pid=1581 题目描述 高精度减法 输入输出格式 输入格式: 两个整数a,b(第二个可能比第一个大) 输出格式: 结果(是负数要输出负号) 输入输出样例 输入样例#1: 2 1 输出样例#1: 1 说明 20%数据a,b在long long范围内 100%数据0<a,b<=10的10000次方 AC代码: 1 #include<alg

P2142 高精度减法

题目描述 高精度减法 输入输出格式 输入格式: 两个整数a,b(第二个可能比第一个大) 输出格式: 结果(是负数要输出负号) 输入输出样例 输入样例#1: 2 1 输出样例#1: 1 说明 20%数据a,b在long long范围内 100%数据0<a,b<=10的10000次方 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 usin

AcWing 792.高精度减法

AcWing 792.高精度减法 题目描述 给定两个正整数,计算它们的差,计算结果可能为负数. 输入格式 共两行,每行包含一个整数. 输出格式 共一行,包含所求的差. 数据范围 1≤整数长度≤105 输入样例 32 11 输出样例 21 题目思路 低角标存低位,高角标存高位:依次进位 #include<iostream> #include<string> #include<vector> using namespace std; bool cmp(vector<i

高精度减法,在做小减大时可花了我不少时间!

减法: #include<stdio.h> #include<string.h> int main() { char s1[1000]; int a[1000]={0},b[1000]={0},c[1000]={0},l1=0,l2=0,l=0,i,x; scanf("%s",s1); l1=strlen(s1); for(i=0;i<=l1-1;i++) { a[l1-1-i]=s1[i]-'0'; } scanf("%s",s1);

高精度减法?!

高精减 接着上一篇的继续啦!!! 嗯输入就不再讲一遍了.存储和之前是一样的,倒序存储. 减法需要借位,所以解决减法借位是关键. 方法如下: if(a[i]<b[i]){ --a[i+1];//向上一位借一做十 a[i+=10]; } c[i]=a[i]-b[i];//逐位相减 这样就可以处理借位问题. 当然,在减法中还有一个需要处理的问题,当然这个问题很重要 减法中有被减数和减数的说法,当被减数<减数时,就需要解决结果是负数的问题 因为编译器中不可能直接检测出负数,所以这个时候就需要判断两数的

C# 高精度减法 支持小数(待优化)

是现实思路 1,先小数点补位,8913758923475893274958738945793845-4893127498372459823745324532453245.284929384729837498237492 => 8913758923475893274958738945793845.000000000000000000000000-4893127498372459823745324532453245.284929384729837498237492. 2,进行计算,最后补符号 pub

【洛谷】P2142 高精度减法

#include<bits/stdc++.h> using namespace std; struct bign{ int len; string s; void length(){ len = s.length(); } bign operator - (const bign x) const { bign ret,a1,a2; a1.len = len; a1.s = s; a2.len = x.len; a2.s = x.s; int l = a1.len; if (a1.len >

C语言(7)--高精度加法、减法、乘法、今天是星期几、四位平方数、候选人选票问题

1.高精度加法.减法.乘法 #include <stdio.h> #include <string.h> #include <malloc.h> void plus(char *a,char *b,char *c);//自定义高精度加法函数 void sub(char *a,char *b,char *c);//自定义高精度减法函数 void multiply(char *a,char *b,char *c);//自定义高精度乘法函数 int main() { char