字符和数字加减就是字符的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());
//plus
int len = min(len1, len2);
int flag = ;//进位
int num1, num2,num3;
for (int i = ; i < len; ++i) {
num1 = s1[i] - '';//string to int
num2 = s2[i] - '';
num3 = num1 + num2 + flag;
if (num3 > ) {
flag = ;
num3 = num3 % ;
}
else {
flag = ;
}
res.push_back(num3 + '');
}
//find max len1 or len2
if (len1 == len) {
for (int i = len; i < len2; ++i) {
num2 = s2[i] - '';
num3 = num2 + flag;
if (num3 > ) {
flag = ;
num3 = num3 % ;
}
else {
flag = ;
}
res.push_back(num3 + '');
}
} if (len2 == len) {
for (int i = len; i < len1; ++i) {
num1 = s1[i] - '';
num3 = num1 + flag;
if (num3 > ) {
flag = ;
num3 = num3 % ;
}
else {
flag = ;
}
res.push_back(num3 + '');
}
}
if (len1 == len2 && flag == ) {
res.push_back(flag + '');
}
reverse(res.begin(), res.end());
cout << res << endl;
return ;
}

大整数加法

大整数减法运算:

两个字符相减之后需要加上'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 = ; i < len2; ++i) {
if (s1[i] >= s2[i]) {
s1[i] = s1[i] - s2[i] + '';
}
else {//需要借位
s1[i] = + s1[i] - s2[i] + '';
s1[i + ] = s1[i + ] - ;//这里为什么不加上'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] - '' >= ) {
reverse(s1.begin(), s1.end());
return s1;
}
else {
s1[j] = + s1[j];
s1[j + ] = s1[j + ] - ;
}
}
reverse(s1.begin(), s1.end());
return s1;
}
int main() {
string s1, s2, res;
cin >> s1 >> s2;
//保证s1 > s2
if (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('');
res = res.substr(pos);
cout << res << endl;
system("pause");
return ; }

大整数减法

剑指offer第12题打印从1到n位数以及大整数加法乘法的更多相关文章

  1. 【剑指Offer面试编程题】题目1508:把字符串转换成整数--九度OJ

    题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1<= n&l ...

  2. 剑指offer 面试12题

    面试12题: 题目:矩阵中的路径 题:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格 ...

  3. 《剑指offer》刷题目录

    <剑指offer>刷题目录 面试题03. 数组中重复的数字 面试题04. 二维数组中的查找 面试题05. 替换空格 面试题06. 从尾到头打印链表 面试题07. 重建二叉树 面试题09. ...

  4. 剑指Offer - 九度1515 - 打印1到最大的N位数

    剑指Offer - 九度1515 - 打印1到最大的N位数2013-11-30 01:11 题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案 ...

  5. 《剑指offer》算法题第十二天

    今天是<剑指offer>算法题系列的最后一天了,但是这个系列并没有包括书上的所有题目,因为正如第一天所说,这些代码是在牛客网上写并且测试的,但是牛客网上并没有涵盖书上所有的题目. 今日题目 ...

  6. 【剑指Offer】把二叉树打印成多行 解题报告(Python)

    [剑指Offer]把二叉树打印成多行 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  7. 浅谈《剑指offer》原题:不使用条件、循环语句求1+2+……+n

    转载自:浅谈<剑指offer>原题:求1+2+--+n 如侵犯您的版权,请联系:windeal12@qq.com <剑指offer>上的一道原题,求1+2+--+n,要求不能使 ...

  8. 【剑指Offer面试编程题】题目1391:顺时针打印矩阵--九度OJ

    题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2 ...

  9. 【剑指Offer面试编程题】题目1523:从上往下打印二叉树--九度OJ

    题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, ...

随机推荐

  1. 8 HTML DOM 元素的查找与改变&改变CSS样式&HTML事件

    HTML DOM(Document Object Model)文档对象模型 当网页被加载时,浏览器会创建页面的文档对象模型. HTMLDOM 定义了用于HTML的一系列标准的对象.通过DOM,你可以访 ...

  2. 3 Struts2的常见配置解析

    1 package标签的相关配置 package标签:包,与Java中的包概念不一致.旨在更好的管理actionpackage标签的属性: name :  包的名称,在一个项目不重名即可,无具体含义 ...

  3. nginx 书籍

    1.<实战nginx> 2.<深入理解nginx> 3.nginx开发从入门到精通 http://tengine.taobao.org/book/ 4.Nginx源码学习,配置 ...

  4. 原生JS 和 JQ 获取滚动条的高度,以及距离顶部的高度

    JQ:相对比较简便 获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 : $(window).width(); 获取页面的文档高度 ...

  5. Codeforces Round #620 (Div. 2) 题解

    A. Two Rabbits 思路: 很明显,如果(y-x)%(a+b)==0的话ans=(y-x)/(a+b),否则就为-1 #include<iostream> #include< ...

  6. 利用Session实现三天免登陆

    什么是Session Session:在计算机中,尤其是在网络应用中,称为“会话控制”.(百度百科) Session:服务器端的数据存储技术. Session要解决什么问题 一个用户的不同请求(重定位 ...

  7. 应用内打开AppStore上某个应用的下载界面--SKStoreReviewController的使用

    产品设计要求是这样的: 对应的初步代码是这样的: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after ...

  8. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:让按钮看起来像个链接 (仍然保留按钮行为)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. Django settings源码解析

    Django settings源码 Django中有两个配置文件 局部配置:配置文件settings.py,即项目同名文件夹下的settings.py文件 全局配置:django内部全局的配置文件se ...

  10. VUE 动态切换列表active样式

    参考VUE官方文档样式绑定 https://cn.vuejs.org/v2/guide/class-and-style.html 需求是动态加载出来了所有菜单列表,点击其中一个li元素改变这个元素的背 ...