字符和数字加减就是字符的ASCII码和数字直接加减。
方法一:
1)在字符串操作中给一个整形数字加(字符0)就是把它转化为字符,当然给一个字符减去(字符0)就可以把它转化为数字了;如果确实是最后一位字符那仫就把该数字加1( 需要注意的是我们每次都是从最后一个字符开始加起)到这里我们就不得不考虑加法的进位了,只有当字符对应的数字加到10或者比10大时我们需要进位,否则就直接将该数字转化为字符存储到对应字符的位置中去; 在字符所转化的数字进位中不得不考虑的就是如果此时已经是第一个字符了那仫还需要进位吗?当然不需要否则就溢出了;当然如果是普通的情况我们就只需要将该位对应的数字减去10并将进位信号置为1可以了 ;
2).如何输入呢?直接用printf?这就又掉入面试官的陷阱里去了这是面试官设置的第二个陷阱,我们知道在上述思路中当数字不够n位时我们是在前面几位补零,如果我们直接输出,那仫就把前面的零也一起输出了,这当然不符合我们的实际了, 所以这里也是值得我们注意的一个关键点;

方法二:将问题转换成数字排列

我们把问题换个思路考虑,会发现n位所有十进制数其实就是n个从0到9的全排列。也就是说,我们把数字的每一位都 从0到9排列一遍,就可以得到所有的十进制数。只是在打印的时候,排在数字前面的0不打印出来而已。

全排列用递归很容易表达,数字的每一位都可能是0~9中的一个数,然后设置下一位,递归结束的条件是我们已经设置好了数字的最后一位。

大整数相乘

大整数加法运算:

注意进位就行,输入使用cin,注意最后一位可能进位,所以要对flag进行判断。

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<windows.h>
using namespace std;
#define SIZE 1000
int main1() {string s1, s2 , res;    cin >> s1 >> s2;int len1 = s1.size();int len2 = s2.size();reverse(s1.begin(),s1.end());reverse(s2.begin(), s2.end());//plusint len = min(len1, len2);int flag = 0;//进位int num1, num2,num3;for (int i = 0; i < len; ++i) {num1 = s1[i] - '0';//string to intnum2 = s2[i] - '0';num3 = num1 + num2 + flag;if (num3 > 9) {flag = 1;num3 = num3 % 10;}else {flag = 0;}res.push_back(num3 + '0');}//find max len1 or len2if (len1 == len) {for (int i = len; i < len2; ++i) {num2 = s2[i] - '0';num3 = num2 + flag;if (num3 > 9) {flag = 1;num3 = num3 % 10;}else {flag = 0;}res.push_back(num3 + '0');}}if (len2 == len) {for (int i = len; i < len1; ++i) {num1 = s1[i] - '0';num3 = num1 + flag;if (num3 > 9) {flag = 1;num3 = num3 % 10;}else {flag = 0;}res.push_back(num3 + '0');}}if (len1 == len2 && flag == 1) {res.push_back(flag + '0');}reverse(res.begin(), res.end());cout << res << endl;return 0;
}

大整数加法

大整数减法运算:

两个字符相减之后需要加上'0'之后才能变为字符,字符和数字直接加减是ASCII码的加减,例如b - 1等于a的ASCII码。

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
string sub1(string s1, string s2) {reverse(s1.begin(),s1.end());reverse(s2.begin(), s2.end());int len1 = s1.size();int len2 = s2.size();for (int i = 0; i < len2; ++i) {if (s1[i] >= s2[i]) {s1[i] = s1[i] - s2[i] + '0';}else {//需要借位s1[i] = 10 + s1[i] - s2[i] + '0';s1[i + 1] = s1[i + 1] - 1;//这里为什么不加上'0',因为前面加上'0'的本质是s1[i] - s2[i],//只有加上0这个字符的ASCII码才能获得对应的数字比如相减等于16,//加上0的ASCII码,得到字符16
        }                }cout << s1 << endl;for (int j = len2; j < len1; ++j) {if (s1[j] - '0' >= 0) {reverse(s1.begin(), s1.end());return s1;}else {s1[j] = 10 + s1[j];s1[j + 1] = s1[j + 1] - 1 ;}}reverse(s1.begin(), s1.end());return s1;
}
int main() {string s1, s2, res;cin >> s1 >> s2;//保证s1 > s2if (s1.size() < s2.size() || s1.size() == s2.size() && s1 < s2) {swap(s1, s2);}res = sub1(s1, s2);//cout << res << endl;int pos = res.find_first_not_of('0');res = res.substr(pos);cout << res << endl;system("pause");return 0;}

大整数减法

转载于:https://www.cnblogs.com/dingxiaoqiang/p/7658855.html

剑指offer第12题打印从1到n位数以及大整数加法乘法相关推荐

  1. 剑指 offer第12题-矩阵中的路径

    判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向上下左右移动一个格子.如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子. ...

  2. 《剑指offer》刷题——【链表】从尾到头打印链表

    <剑指offer>刷题--[链表]-<从尾到头打印链表> 问题分析: 递归实现: 1. 无返回值 2. 有返回值(ArrayList) 问题分析: 从头到尾打印链表比较简单,那 ...

  3. 《剑指offer》75题 C++详细题解

    目录 简单: 剑指 Offer 03. 数组中重复的数字 map: unordered_map: 原地交换 剑指 Offer 05. 替换空格 剑指 Offer 06. 从尾到头打印链表 出栈入栈 双 ...

  4. 挑战一天(12h)刷完《剑指offer》67题

    提前说明,挑战的人不是我. 大家周末好,我是爱上 B 站的小吴,最近一段时间我在网站 AlgoMooc 录制剑指 Offer 的视频,同时上传了一部分到 B 站,基于推荐算法,B 站疯狂的给我推送如何 ...

  5. 《剑指offer》刷题总结

    从三月初开始刷剑指offer上面的题,到现在花了近二十天的时间终于刷完了.应该说,掌握上面的技巧应付一些公司面试题和小公司的笔试题是完全没有问题的.之前参加一个公司笔试,算法题就有一题是剑指offer ...

  6. 剑指offer第41题 和为s的两个数

    剑指offer第41题 和为s的两个数 #include<iostream> using namespace std;bool sumk(int*list,int length,int*n ...

  7. 《剑指offer》刷题笔记(发散思维能力):求1+2+3+...+n

    <剑指offer>刷题笔记(发散思维能力):求1+2+3+-+n 转载请注明作者和出处:http://blog.csdn.net/u011475210 代码地址:https://githu ...

  8. 《剑指Offer》刷题之最小的K个数

    <剑指Offer>刷题之最小的K个数 我不知道将去向何方,但我已在路上! 时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 ! 题目: 给定一个数组,找出其中最小的K个数. ...

  9. 《牛客网 剑指Offer前20题》

    <剑指Offer> 牛客网 前20道题 前言知识 面试题1:二维数组中的查找 面试题2:二维数组中的查找 面试题3:从头到尾打印链表 面试题4:重建二叉树 ***** 面试题5:两个栈实现 ...

最新文章

  1. linux输出指定数量脉冲,ESM335x Linux输出脉冲计数
  2. 优秀的缓存工具Memcached
  3. Perl学习笔记(十)--通过DBI访问数据库
  4. Oracle安装完成后如何创建表空间及用户
  5. css flexbox模型_Flexbox和CSS Grid之间的主要区别
  6. 从0开始详解 Johnson 全源最短路(P5905 【模板】Johnson 全源最短路)
  7. 解决使用sudo没问题,但是使用su会报错 su: Authentication failure 的问题
  8. mysql去重查询group_MySQL distinct 与 group by 去重(where/having)
  9. 内是不是半包围结构_半包围结构(一)
  10. Oracle 11g RAC oc4j/gsd Offline
  11. OLAP引擎——Kylin介绍
  12. SpringBoot + Vue 学生管理系统源码(包含数据库文件)
  13. 计算机无法连上网怎么办,电脑显示已连接上但是无法上网怎么办
  14. 蓝牙怎么调声音大小_苹果蓝牙耳机
  15. python实现词云且更换背景图片
  16. 导入的素材PS突然很卡,但是内存足够、素材图层也不多。。。该怎么办呢????
  17. 项目实训第一周第三篇
  18. 如何解析xml报文获取数据集合
  19. 中国的漫威,还很遥远么
  20. 标志设计中选择合适的字体

热门文章

  1. 前端HTML5CSS3动画
  2. xstream解析xml字符串和生成对象
  3. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案(一)
  4. 俄罗斯方块之四 运动块的绘制实现
  5. 《TOMCAT权威指南》摘抄
  6. HTTP协议中的Content-Encoding
  7. windows下的使用别人编译好的库文件进行安装xgboost
  8. 剑指offer 从头到尾打印链表
  9. 基于SSD的Kafka应用层缓存架构设计与实现
  10. Elasticsearch常用工具清单