大数加法(加数可为负数)


·分析:

大数加法有如下几种情况:
1.两数同号
(1)同正:如,s1=11,s2=22;s1=0,s2=0
(2)同负:如,s1=-11,s2=-22
2.两数异号
(1)正数加负数:如,s1=11,s2=-9
  1)s1的长度大于s2绝对值的长度:如,s1=11,s2=-9
  2)s1和s2绝对值的长度相等但s1大于等于s2的绝对值:s1=106,s2=-104;s1=11,s2=-11
  3)s1的长度小于s2绝对值的长度:如,s1=9,s2=-11
  2)s1和s2绝对值的长度相等但s1小于s2的绝对值:s1=104,s2=-106
(2)负数加正数:如,s1=-9,s2=11
    位置转换可变换为“正数加负数”形式


处理:

首先,将大数以字符串形式输入
其次,判断s1与s2符号,调用不同函数处理
(1)同号:调用Plus函数
   1)如果同正,设置标志结果符号的flag为0,将两个字符串转化为数组形式倒序存储
   2)如果同负,设置标志结果符号的flag为1,将两个字符串转化为数组形式倒序存储,但不存储两字符串的第0位(因为第0位为负号)
   3)将两数组对应位相加,位数满10进1
   4)根据flag值输出结果的符号
   5)判断最高位是否为0,输出结果数组
(2)异号:调用Minus函数
   1)调用函数时以正数-负数顺序传递实参给形参,即s1为正数,s2为负数
   2)将两个字符串转化为数组形式倒序存储,但不存储s2字符串的第0位(因为s2[0]为负号)
   3)判断结果符号,根据两数大小,有两种情况:
     1)s1的长度大于s2的长度或s1和s2长度相等但s1大于等于s2,即:
           len1>(len2-1) 或 len1==(len2-1),s1>=s2 做num1-num2,设置flag=0,标志得正数
     2)s1的长度小于s2的长度或s1和s2长度相等但s1小于s2,即:
           len1<(len2-1)或 len1==(len2-1),s1<s2 做num2-num1,设置flag=1,标志得负数
     3)调用Minus_show函数
           - 对传进来的num1-num2或num2-num1做减法计算
           - 将两数组对应位相减,位数不够减向前借1
           - 根据flag值输出结果的符号
           - 判断最高位是否为0,输出结果数组


实现:

#include<stdio.h>
#include<string.h>
char s1[10005],s2[10005],s3[10005];
int num1[10005],num2[10005];
int len1,len2,i,j;//当s1与s2同号,利用flag标志结果的符号(0为正,1为负)
void Plus(int flag)
{len1=strlen(s1);len2=strlen(s2);for(i=len1-1,j=0; i>=0 ; i--){num1[j]=s1[i]-48;j++;if(i==flag) break; //如果s1与s2同负,flag=1,则不进行下一次循环赋值字符串第0位}for(i=len2-1,j=0; i>=0 ; i--){num2[j]=s2[i]-48;j++;if(i==flag) break; //如果s1与s2同负,flag=1,则不进行下一次循环赋值字符串第0位}//计算两字符串长度最大值作为和的长度int len;if(flag==0) len=len2>len1?len2:len1;else len=len2>len1?(len2-1):(len1-1); //如果s1与s2同负,flag=1,len值应为长度减1//进行加计算及进位for(i=0; i<len; i++){num1[i]+=num2[i];if(num1[i]>9){num1[i+1]+=1;num1[i]-=10;}}//输出符号位if(flag==1) printf("-"); //如果s1与s2同负,flag=1,结果的符号位为负//输出结果if(num1[i]) //最高位进位{for(j=i; j>=0; j--)printf("%d",num1[j]);printf("\n");}else        //最高位未进位{for(j=i-1; j>=0; j--)printf("%d",num1[j]);printf("\n");}
}//对异号的s1和s2处理成“大数-小数”形式后调用该函数进行减计算并显示,利用flag标志结果的符号(0为正,1为负)
void Minus_show(int flag,int len,int num1[],int num2[])
{//进行减计算及借位for(i=0; i<len; i++){if(num1[i]>=num2[i]){num1[i]-=num2[i];}else{num1[i]=num1[i]+10-num2[i];num1[i+1]-=1;}}//输出过滤掉结果前面无效的0while(num1[--i]==0){if(i==0) break;}//输出符号位if(flag==1) printf("-");  //flag=1,结果的符号位为负//输出结果for(j=i; j>=0; j--)printf("%d",num1[j]);printf("\n");
}
//当s1与s2异号,以正数-负数顺序传递实参给形参
void Minus(char s1[],char s2[])
{len1=strlen(s1);len2=strlen(s2);for(i=len1-1,j=0; i>=0 ; i--)  //s1为正数{num1[j]=s1[i]-48;j++;}for(i=len2-1,j=0; i>0 ; i--)  //s2为负数,s2[0]为符号位,不要{num2[j]=s2[i]-48;j++;}memset(s3,0,sizeof(s3)); //为了便于比较同长度下的两个数的大小,将去掉负号的s2赋值给s3for(i=1,j=0; i<len2; i++){s3[j++]=s2[i];}//【3】 对应计算例子:(1)s1=11,s2=-9 ;(2)s1=106,s2=-104;(3)s1=11,s2=-11//len1>(len2-1) 或 len1==(len2-1),s1>=s2 做num1-num2,设置flag=0,标志得正数if(len1>(len2-1)||(len1==(len2-1)&&strcmp(s1,s3)==0)||len1==(len2-1)&&strcmp(s1,s3)==1){Minus_show(0,len1,num1,num2);}//【4】对应计算例子:(1)s1=9,s2=-11 ;(2)s1=104,s2=-106//(len2-1)>len1 或 len1==(len2-1),s1<s2  做num2-num1,设置flag=1,标志得负数else if((len2-1)>len1||(len1==(len2-1)&&strcmp(s1,s3)==-1)){Minus_show(1,len2-1,num2,num1);}
}
int main()
{while(1){//printf("please intput numbers:\n");scanf("%s%s",s1,s2);memset(num1,0,sizeof(num1));memset(num2,0,sizeof(num2));//【1】对应计算例子:(1)s1=11,s2=22;(2)s1=0,s2=0if(s1[0]!='-'&&s2[0]!='-'){Plus(0); //s1与s2同正,设置flag=0}//【2】对应计算例子:(1)s1=-11,s2=-22else if(s1[0]=='-'&&s2[0]=='-'){Plus(1); //s1与s2同负,设置flag=1}//【3】对应计算例子:s1=11,s2=-9else if(s1[0]!='-'&&s2[0]=='-'){Minus(s1,s2); //s1为正,s2为负,传递s1,s2顺序,实现一个正数减一个负数}//【4】对应计算例子:s1=-9,s2=11else{Minus(s2,s1); //s1为正,s2为负,传递s2,s1顺序,实现一个正数减一个负数}}return 0;
}

大数加法分析及C语言实现(加数可为负数)相关推荐

  1. c语言 大数开方,大数加法之C语言函数法(只有正数版)

    由于某些原因,我于今天2017-4-19将我的博文搬到博客园了,以后我就在这里扎根了. 之前想过在博客写文章方便日后复习,但一直未能实现,所以,现在这篇是我个人人生中第一篇博客,所以写博客完全没经验, ...

  2. 51NOD-1005 大数加法【大数】

    1005 大数加法  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个大整数A,B,计算A+B的结果. Input 第1行:大数A 第2行:大数B (A,B的长度 ...

  3. (52)FPGA面试题-利用函数function实现半字节加法功能(Verilog语言实现)

    1.1 FPGA面试题-利用函数function实现半字节加法功能(Verilog语言实现) 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-利用函数fu ...

  4. A + B Problem II 大数加法

    题目描述: Input The first line of the input contains an integer T(1<=T<=20) which means the number ...

  5. C++大数加法-----OvO

    简单大数加法 可以将加数存放在数组中,按位让数组元素相加,对结果进行进位操作,最后进过转换(消0.逆序)输出结果* ↓↓↓代码↓↓↓ #define _CRT_SECURE_NO_WARNINGS// ...

  6. 大数加法【HDU 1002】

    大数加法模板 一般的加法只要int类型的两数直接相加即可,大一点的数可以设为long long类型,而超过长整型的数则属于大数问题了,大数加法其实也比较简单,利用数组实现就可以啦: 主要思想如下: ( ...

  7. python【蓝桥杯vip练习题库】ADV-136大数加法(高精度加法)

    试题 算法提高 大数加法 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输入两个正整数a,b,输出a+b的值. 输入格式 两行,第一行a,第二行b.a和b的长度均小于1000位. ...

  8. c语言报告程序分析报告,2012C语言程序分析报告.doc

    2012C语言程序分析报告 C语言程序设计专周 专 周 报 告 班级:10611 学号:20 姓名: 设计时间:2011-5-30至2011-6-3 一.设计题目:职工工资管理小软件 二.实习目的 1 ...

  9. Java实现大数乘法_java实现大数加法、乘法(BigDecimal)

    之前写过用vector.string实现大数加法,现在用java的BigDecimal类,代码简单很多.但是在online-judge上,java的代码运行时间和内存大得多. java大数加法:求a+ ...

最新文章

  1. 分布式服务治理框架Dubbo
  2. 第一次作业:Linux 2.6.32的进程模型与调度器分析
  3. cleanmymac3.9.6下载_单耳兔o2oapp下载-单耳兔o2o商城官方版下载v10.6 安卓版
  4. anime.js 实战:实现一个带有描边动画效果的复选框...
  5. hadoop大数据平台架构之DKhadoop详解
  6. Envi IDL中多元线性回归计算方法
  7. android调用so封装jni,GitHub - Michelle0716/AndroidJniDemo1: 安卓对c进行so文件打包,并以jni的形式进行调用...
  8. C++(STL):17---deque之迭代器使用
  9. 好看的表白墙LoveCards v1.0.4 源码(开源)
  10. python 百度识图_用python做图片识别(调用百度API)
  11. OpenGL基础51:泛光
  12. .net流行面试试题(基础但重要)
  13. weblogic调整多个服务启动顺序方法
  14. 原生JS与其他JS 区别
  15. OSChina 周二乱弹 ——流川枫与苍井空
  16. 怎么更改网络选项为家庭计算机,我的现在是公用网络我想更改为家庭网络应该如何更改...
  17. Windows NTSTATUS Values 进程终止消息标识符
  18. 201871010133 赵永军《面向对象程序设计(java)》第六、七周学习总结
  19. 关于北京工作居住证相关问题
  20. 学php应该怎么学习数学,数学难学,数学到底该怎么学?

热门文章

  1. 2022-2028年中国自动驾驶系统行业现状调研分析报告
  2. 2022-2028年中国自主可控行业深度调研及投资前景预测报告(全卷)
  3. 2022-2028年中国体育用品行业投资分析及前景预测报告(全卷)
  4. 中信银行总行信息科技部笔试面试以及最后拿offer经历
  5. react非常适合入门者学习使用的后台管理框架
  6. The listener supports no services
  7. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))) TNS-12541: TNS:no li
  8. ONNX 实时graph优化方法
  9. CUDA运行时 Runtime(一)
  10. 2021年大数据Hive(四):Hive查询语法