高精度减法?!

高精减

接着上一篇的继续啦!!!

嗯输入就不再讲一遍了。存储和之前是一样的,倒序存储。

减法需要借位,所以解决减法借位是关键。

方法如下:

if(a[i]<b[i]){
    --a[i+1];//向上一位借一做十
    a[i+=10];
}
c[i]=a[i]-b[i];//逐位相减

这样就可以处理借位问题。



当然,在减法中还有一个需要处理的问题,当然这个问题很重要

减法中有被减数和减数的说法,当被减数<减数时,就需要解决结果是负数的问题

因为编译器中不可能直接检测出负数,所以这个时候就需要判断两数的大小,对它们进行交换

得出结果后,再在结果前输出负号。

if((lena<lenb)||(lena==lenb&&strcmp(n1,n2)<0)){
//这里strcmp()为字符串的比较函数具体的可以自己查阅书籍?!
//好吧作为好人还是说一下:这个函数里n1>n2时,返回0
//n1>n2时,返回正整数;n1<n2时,返回负整数
//这里处理的是减数和被减数
    strcpy(n,n1);strcpy(n1,n2);strcpy(n2,n);//类似于c++开头的交换
//交换被减数和减数
    cout<<"-";//此处结果为负值所以输出负号(因为交换了被减数和减数)
}

下面是更简洁的方法:

 if(n2>n1)//这一步是判断那个数长,哪个就大,就用哪个做被减数存到数组c中,哪个小就存到d中
{
        for(i=0;i<n2;i++) swap(c[i],d[i]);//把两数交换,swap为交换函数
        f=1;//设一个旗帜,以后如果f=1就说明这数被减数比减数小,是负数。
}

其实一个交换函数就解决的来着:(swap万岁!!!)



然后呢,减数还有个好玩的地方:

就是被减数减掉减数后开头会有零,可是零不能输出呢!

所以又有问题了:

其实解决很简单,把开头几位给舍去就好

while((c[lenc]==0)&&(lenc>1))
lenc--;//轻松解决最高位的0不输出问题!!!


例题:

洛谷P2142

传送门

这一题,嗯,就是写就是了。。。

#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
const int Maxn=100010;
char a[Maxn],b[Maxn];//字符串存数
int c[Maxn],d[Maxn],h[Maxn],n1,n2,i,flag=0,l=0;
int main()
{
    scanf("%s%s",&a,&b);//读入两个字符串
    n1=strlen(a);//求字符串长度
    n2=strlen(b);
    for(i=0;i<n1/2;i++)
        swap(a[i],a[n1-1-i]);
    for(i=0;i<n2/2;i++)
        swap(b[i],b[n2-1-i]);
    for(i=0;i<n1;i++) c[i]=a[i]-‘0‘;
    for(i=0;i<n2;i++) d[i]=b[i]-‘0‘;
    //把字符串a与b的字符转化为数字存到数组c与d当中。其中"-‘0‘"或者"-48"为转换方法
    if(n2>n1)
    //这一步是判断哪个数值更大,就用哪个做被减数存到数组c中,哪个小就存到数组d中
    {
        for(i=0;i<n2;i++) swap(c[i],d[i]);//把两数交换,swap为交换函数
        flag=1;//创建旗帜,如果f=1就说明这数被减数比减数小,所得结果就为负数
    }
    if(n1>n2) swap(n1,n2); //取较长的数做for循环条件
    for(i=0;i<n2;i++) h[i]=c[i]-d[i];
    for(i=0;i<n2;i++)//借位
    {
         if(h[i]<0)
         {
             h[i]=10+h[i];
             h[i+1]--;
         }
    }
    if(flag==1) cout<<"-";//如果f等于1,结果就是负数,输出‘-‘
    for(i=n2-1;i>=0;i--)//这步很重要!!! 这是在输出时把首位的0都去掉
    {
         if(l==0)//设了一个l,如果l为0意味着还没有碰到非零数,也就是有0就要去掉的0
         {
             if(h[i]!=0) //如果这数不为零
             {
                 l=1;//l=1表明碰到了非零数了以后的0有实际意义要输出
                 cout<<h[i];//输出此数
                 continue;//然后跳出本次循环
             }
         }
         if(l!=0)//如果l不等于0,就说明这时的0有实际意义,要输出
            printf("%d",h[i]);
    }
}

高精减也就这样吧

原文地址:https://www.cnblogs.com/U58223-luogu/p/9490270.html

时间: 2024-10-03 14:45:25

高精度减法?!的相关文章

高精度减法

高精度减法(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

C++ 该死的高精度减法

没看书直接硬上的结果是,一个简单的高精度减法我用了一个多小时只写了一个90分的代码.之前准备NOIP的时候确实是学了,可惜现在早就还给老师了. 结果回家一看标准程序,顿时有种想哭的赶脚. 先上我的90分代码: //高精度减法 #include<iostream> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector>

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);

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