《编程思维与实践》1064.A-B(Big Integer)

news2024/11/18 19:35:54

《编程思维与实践》1064.A-B(Big Integer)

题目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qrqCAB6n-1683870404012)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230512125846390.png)]

思路

两个大整数做减法有可能出现结果为负的情况,因此结构体BIGINT需要补充符号位sign,

因为减法是个位对齐进行操作,为了方便起见,本题还是采用逆序(个位开始)存储.

注意到本题的两个整数均非负,所以不需要考虑转化为加法的情况(减负数等价于加正数).

A-B有以下几种情况:

1.A位数比B大,直接从个位开始减即可,不足注意借位;

2.A位数比B小,结果的符号位变为-1,转化为B-A;

3.A位数与B位数相同,此时需要比对A和B的大小,应该从最高位开始比:

如果从最高位开始A有一位大于B,那么就能保证A>B;

如果从最高位开始A有一位小于B,那么就能保证A<B;

如果该位A等于B,则比较下一位.

之后进行类似1和2的操作即可.

注意的点:

做完减法后记得去除前置0(保留最后一个).

代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 500

typedef struct{int cnt,v[N],sign;}BIGINT;

BIGINT sub(BIGINT S, BIGINT T,int sign);     //两个大整数相减 subtraction

int main()
{
	char s1[501],s2[501];
	while(scanf("%s",s1)!=EOF&&scanf("%s",s2)!=EOF)
	{
		BIGINT A={strlen(s1),{0}},B={strlen(s2),{0}};
		for(int i=0;i<strlen(s1);i++)
		{
			A.v[A.cnt-1-i]=s1[i]-'0';
		}
		for(int i=0;i<strlen(s2);i++)
		{
			B.v[B.cnt-1-i]=s2[i]-'0';
		}
		BIGINT ans=sub(A,B,1); 
		if(ans.sign==-1)
		{
			printf("-");
		}
		for(int i=ans.cnt-1;i>=0;i--)
		{
			printf("%d",ans.v[i]);
		}
		printf("\n");
	} 
    return 0;
}

BIGINT sub(BIGINT S, BIGINT T,int sign)     //两个大整数相减 两个大整数均非负
{
    if(S.cnt<T.cnt)
    {
        return sub(T,S,-1);
    }
    else if(S.cnt==T.cnt&&sign!=-1)  
    {
        for(int i=T.cnt-1;i>=0;i--)   //注意是从最高位开始比 
        {
            if(T.v[i]<S.v[i])
            {
                break;
            }
            else if(T.v[i]>S.v[i])
            {
                return sub(T,S,-1);
            }
        }
    }
	BIGINT R={S.cnt,{0},sign};
	int flag=0;  //借位
	for(int i=0;i<R.cnt;i++)
	{
		if(S.v[i]-flag-T.v[i]>=0)
        {
            R.v[i]=S.v[i]-T.v[i]-flag;
            flag=0;
        }
        else
        {
            R.v[i]=S.v[i]-T.v[i]-flag+10;
            flag=1;
        }
	}
	for(int i=R.cnt-1;i>=1&&R.v[i]==0;i--)
    {
        R.cnt--;
    }
	return R;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/517256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TOOM舆情监测系统:从原理到应用

舆情监测系统是一种可以帮助企业、政府等机构了解公众对自己的看法和态度&#xff0c;提前发现和预测可能出现的危机或负面舆情&#xff0c;从而进行预警和应对的工具。本文将从原理到应用&#xff0c;通过国内具体案例分析&#xff0c;探讨舆情监测系统的相关知识。 一、舆情…

DSP:数字信号处理的原理及应用

什么是DSP&#xff1f;DSP一般有两种解释&#xff1a; 1、Digital Signal Processing&#xff0c;数字信号处理技术&#xff0c;简称DSP。是一门涉及许多学科而又广泛应用于许多领域的新兴学科。数字信号处理是围绕着数字信号处理的理论、实现和应用等几个方面发展起来的。数字…

有哪些好用的AI工具?

现在有很多好用的AI工具&#xff0c;以下是一些常用的&#xff1a; 1. TensorFlow&#xff1a;谷歌开发的深度学习框架&#xff0c;支持多种编程语言&#xff0c;包括Python、C、Java等。 2. PyTorch&#xff1a;Facebook开发的深度学习框架&#xff0c;易于使用&#xff0c;…

干货分享:PCB防静电设计的必要性

平时通过走路穿衣等日常活动带来的摩擦&#xff0c;会产生不同幅值的静电电压&#xff0c;但其能量很小不会对人体产生伤害&#xff0c;不过对于电子元器件来说&#xff0c;这种静电能量却是不能忽视的。 在干燥的环境下&#xff0c;人体静电&#xff08;ESD&#xff09;的电压…

matlab实验二可视化

学聪明点&#xff0c;自己改&#xff0c;别把我卖了 一、实验目的及要求 要求 1、掌握 MATLAB常用的二维和三维绘图函数 2、掌握MATLAB的图形注释 3、熟悉MATLAB常用的图形修饰 4、熟悉MATLAB的图形动画 实验原理 1、MATLAB二维绘图&#xff1a;plot,fplot,fimplicit&#xf…

Matlab 非线性迭代法(2)高斯牛顿法

一、思想 高斯牛顿法的对象是最小二乘法。 采用一定的方法对Hession 矩阵进行近似&#xff0c;这样的话可以减少计算量&#xff0c;只需要计算一阶偏导数得到雅可比矩阵即可。 minF(x)|| f(x)||^2 那么x在xk处的增量Δxk出的最小二乘法为 minF(xkΔxk)∣∣f(xk​Δxk​)∣…

Word处理控件Aspose.Words功能演示:使用 Java 处理 Word 文档的原始版本或修订版本

Aspose.Words是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。 Aspose API支持流行文件格式处理&#xff0c;并…

企业电子招投标采购系统源码之登录页面-java spring cloud

​ 信息数智化招采系统 服务框架&#xff1a;Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构&#xff1a;VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术&#xff1a;Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、…

制造业为什么要数字化?有何意义?

制造业为什么要数字化&#xff1f;有何意义&#xff1f; 党的二十大报告指出&#xff0c;要“坚持把发展经济的着力点放在实体经济上&#xff0c;推进新型工业化”“促进数字经济和实体经济深度融合”。 新一代信息技术催生第四次工业革命&#xff0c;互联网、大数据、人工智能…

MISC:图片隐写的破解方法.

MISC&#xff1a;图片隐写的破解方法. Misc即杂项&#xff0c;是信息隐藏又称信息伪装&#xff0c;就是通过减少载体的某种冗余&#xff0c;如空间冗余、数据冗余等&#xff0c;来隐藏敏感信息&#xff0c;达到某种特殊的目的。 信息隐藏打破了传统密码学的思维范畴&#xff0…

软件开发企业如何合理解决企业增值税和所得税问题?

业务是流程&#xff0c;财税是结果&#xff0c;税收问题千千万&#xff0c;关注《税算盘》来帮你找答案。 软件开发是根据用户的要求建造出软件系统或者系统中的软件部分的过程&#xff0c;软件开发是一项包括需求捕捉、需求分析、设计、实现和测试的系统工程。 与传统产业的…

实现高并发秒杀的 7 种方式

1.引言 高并发场景在现场的日常工作中很常见&#xff0c;特别是在互联网公司中&#xff0c;这篇文章就来通过秒杀商品来模拟高并发的场景。文章末尾会附上文章的所有代码、脚本和测试用例。 本文环境&#xff1a; SpringBoot 2.5.7 MySQL 8.0 X MybatisPlus Swagger2.9.2 …

【GPT-4理论系列篇】GPT-4核心技术探秘 | 京东云技术团队

作者&#xff1a;京东零售 刘岩 前言 GPT-4已经发布有一段时间了&#xff0c;但是出于安全性等各种原因&#xff0c;OpenAI并没有公布GPT-4的技术细节和代码&#xff0c;而是仅仅给出了一个长达100页的技术报告[1]。这个技术报告着重介绍了GPT-4的强大之处&#xff0c;仅仅给…

分享Python采集66个html5代码,总有一款适合您

分享Python采集66个html5代码&#xff0c;总有一款适合您 Python采集的66个html5代码下载链接&#xff1a;https://pan.baidu.com/s/1z0AsahthBcpDECA1bVg5ZA?pwd168a 提取码&#xff1a;168a 基于canvas的背景颜色渐变动画插件 jquery音乐播放器插件jsRapAudio HTML5 sv…

SpringBoot整合ES,ik分词器

"reason": "Failed to parse mapping: analyzer [ik_max_word] has not been configured in mappings" 这是因为没有安装ES的IK分词器 下载地址 Release v8.7.0 medcl/elasticsearch-analysis-ik GitHub ElasticSearch 内置了分词器&#xff0c;如标准…

分享Python采集240个jQuery代码,总有一款适合您

分享Python采集240个jQuery代码&#xff0c;总有一款适合您 Python采集的240个jQuery代码下载链接&#xff1a;https://pan.baidu.com/s/1S_lV6aoXOtohc3zk3r3uxA?pwd2h4r 提取码&#xff1a;2h4r jQuery实时搜索插件-HideSeek ps样式的jQuery颜色选择插件 colpick-jQuer…

蓝桥杯青少组python:第十三届省赛第一场

选择题 1、下列二进制中最大数是&#xff08;&#xff09; A 110 B 1010 C 1100 D 1001 2、以下方法&#xff0c;不是对文件读操作的是() A readline() B readlines() C readtext() D read() 3、以下对turtle库中函数描述正确的是() A goto()函数设置当前画笔移动到原点位置…

抢先看~详细、全面的文档处理控件Aspose.words 功能一览

Aspose.Words是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。(技术交流q群&#xff1a;761297826) Aspose API…

三.Android系统的启动流程

Android系统总体启动流程 Boot ROM (启动只读存储器,Loader层) 当电源按下时,引导芯片代码会从预定义的地方(固化在ROM中,Read Only Memory)开始执行,加载引导程序BootLoader到RAM(Random Access Memory),然后执行 Boot Loader (启动加载器,类似于Windows的bios系统,Loader层)…

C++:C++PrimerPlus第六版:Chapter9:内存模型和名称空间

Chapter9&#xff1a;内存模型和名称空间 1. C源文件组织策略我们先看下面程序清单&#xff1a; coordin.hmain.cppCoordin.cpp 2. 内存存储方案2.1 自动存储持续性2.2 静态存储持续变量2.3 存储方案和动态分配 本章节从三个大方面做总结 C多个源文件组织方式C存储方案C名称空间…