大数加减(51nod)
1005 大数加法
输入
第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
输出
输出A + B
输入样例
68932147586
468711654886
输出样例
537643802472
/*
1、首先char数组输入。加法和减法的方法都是将char数组转为倒叙int型数组,再用一个新的int新数组的记录结果。 注意!!!两个新的int数组需要初始化为0 。
同号:可以认为是大数加法 , 需要注意的是进位。
异号:的话需要先比较两个字符数组的去掉“-”后的两个数的绝对值大小(函数strcmp())已确定是否需要“-”再作减法 , 注意去前置0。
*/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int N = ; int cmp(char *a , char *b)
{
int len1 = strlen(a), len2 = strlen(b);
if(len1 > len2 || (len1 == len2 && strcmp(a , b) > ))
return ;
return - ;
} void plu(char *a , char *b)
{
int len1 = strlen(a) , len2 = strlen(b) ;
int c[N] , d[N] , e[N];
memset(c , , sizeof(c)) ;
memset(d , , sizeof(d)) ;
int j = ;
for(int i = len1 - ; i >= ; i--)
c[j++] = a[i] - '';
j = ;
for(int i = len2 - ; i >= ; i--)
d[j++] = b[i] - '';
int len = max(len1 , len2);
int k = ;
for(int i = ; i < len ; i++)
{
e[i] = (c[i] + d[i] + k) % ;
k = (c[i] + d[i] + k) / ;
}
if(k)
{
len ++ ;
e[len - ] = k ;
}
for(int i = len - ; i >= ; i--)
{
cout << e[i] ;
}
cout << endl ;
}
void jian(char *a , char *b)
{
int len1 = strlen(a) , len2 = strlen(b) ;
int c[N] , d[N] , e[N];
memset(c , , sizeof(c)) ;
memset(d , , sizeof(d)) ;
int j = ;
for(int i = len1 - ; i >= ; i--)
c[j++] = a[i] - '';
j = ;
for(int i = len2 - ; i >= ; i--)
d[j++] = b[i] - '';
int len = max(len1 , len2);
for(int i = ; i < len ; i ++)
{
e[i] = c[i] - d[i] ;
if(e[i] < )
{
c[i+]--;
e[i] += ;
}
} for(int i = len - ; i >= ; i--)
{
if(e[i] == )
{
len -- ;
}
else{
break ;
}
}
if(len == )
cout << << endl ;
else
{
for(int i = len - ; i >= ; i --)
cout << e[i] ;
cout << endl ;
} } int main()
{
char a[N] , b[N] ;
while(~scanf("%s%s" , &a , &b))
{
char c[N] , d[N] ;
int len1 = strlen(a) , len2 = strlen(b);
for(int i = ; i < len1 ; i++)
c[i - ] = a[i] ;
for(int i = ; i < len2 ; i++)
d[i - ] = b[i] ;
if(a[] == '-' && b[] == '-')
{
cout << '-' ;
plu(c , d) ;
}
else if(a[] == '-')
{
if(cmp(c , b) > )
{
cout << '-' ;
jian(c , b) ;
}
else
{
jian(b , c) ;
}
}
else if(b[] == '-')
{
if(cmp(d , a) > )
{
cout << '-';
jian(d , a);
}
else
{
jian(a , d);
} }
else
{
plu(a , b);
} }
return ;
}
但是这个大数计算方法提交会超时(太low了)。。。
2、
用string函数的相关操作。
比第一份代码好在没有进行用int数组进行转换,节省了很多时间..
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
const int N = ; int cmp(string a , string b)
{
int len1 = a.length(), len2 = b.length();
if(len1 > len2 || (len1 == len2 && a.compare(b) > ))
return ;
return - ;
} void plu(string a , string b)
{
string c ;
int i , j , k = , x , y ;
for(i = a.length() - , j = b.length() - ; i >= && j >= ; i-- , j--)//对两个数的公共部分进行加法操作.
{
x = a[i] - '' ;
y = b[j] - '' ;
c += (x + y + k) % + '' ;
k = (x + y + k) / ;
}
while(i >= ) 对更长的数进行进位处理..
{
x = a[i] - '' ;
c += (x + k) % + '' ;
k = (x + k) / ;
i-- ;
}
while(j >= )//同上...
{
y = b[j] - '' ;
c += (y + k) % + '' ;
k = (y + k) / ;
j-- ;
}
if(k)//判断最高位是否需要进位...
{
c += k + '' ;
}
reverse(c.begin() , c.end()); // 将字符串反转...
cout << c << endl ; } void jian(string a , string b)
{
string c ;
int i , j , x , y ;
for(i = a.length() - , j = b.length() - ; i >= && j >= ; i-- , j--)//对各个部分进行减法操作...
{
x = a[i] - '';
y = b[j] - '';
if(x - y < )
{
a[i - ]--; // 如果不够减就向上一位借位..
c += (x - y + ) + '' ;
}
else
{
c += (x - y) + '';
}
}
while(i >= ) // 对更长部分的数的部分进行借位操作...
{
x = a[i] - '' ;
if(x < )
{
a[i - ]--;
c += (x + ) + '';
}
else
{
c += x + '';
}
i--;
}
while(j >= )
{
y = b[j] - '' ;
if(y < )
{
b[j - ]--;
c += (y + ) + '';
}
else
{
c += y + '';
}
j-- ;
}
int l = c.length() - ;//删除前置0 ...
while(c[l] == '')
{
c.erase(c.end() - );
l = c.length() - ;
}
if(c.length() == )//如果全为0 , 则输出0...
cout << << endl ;
else
{
reverse(c.begin() , c.end());
cout << c << endl ;
}
} int main()
{
string a , b ;
while(cin >> a >> b)
{
string c(a , ) , d(b , ); // 将a , b 字符的首位去除得到两个新的字符串c , d .. if(a[] == '-' && b[] == '-')// 两个数为"-"
{
cout << '-' ;
plu(c , d) ;
}
else if(a[] == '-') a 为负数 ,
{
if(cmp(c , b) > ) //
{
cout << '-' ; // 且a 的绝对值大于 b
jian(c , b) ;// 将a去除负号的字符串c 减去 b ...
}
else
{
jian(b , c) ; // a 绝对值小于 b 用b 减去c ..
}
}
else if(b[] == '-')
{
if(cmp(d , a) > )
{
cout << '-';
jian(d , a);
}
else
{
jian(a , d);
}
}
else
{
plu(a , b);
}
}
return ;
}
大数加减(51nod)的更多相关文章
- SPOJ VLATTICE - Visible Lattice Points 【“小”大数加减】
题目链接 一道比较简单的莫比乌斯反演,不过ans会爆long long,我是用结构体来存结果的,结构体中两个LL型变量分别存大于1e17和小于1e17的部分 #include<bits/stdc ...
- JavaScript 加减危机——为什么会出现这样的结果?
在日常工作计算中,我们如履薄冰,但是 JavaScript 总能给我们这样那样的 surprise~ 0.1 + 0.2 = ? 1 - 0.9 = ? 如果小伙伴给出内心的结果: 0.1 + 0.2 ...
- Android带加减的edittext
看了网上这样自带加减的edittext写得好复杂,还有各种监听事件,我觉得没有必有.于是我自己写了一个. 我这个edittext仅仅限制整数,每次加减1. public class TestEditT ...
- js实现输入框数量加减【转】
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 自己动手丰衣足食之 jQuery 数量加减插件
引言 做一个手机端的订单相关项目中,其中下订单时需要用到数量加减的控件,可以设置默认值,也可以设置最大值和最小值.使用jQuery这么长时间了,平时很少去编写属于自己的插件,现在编写的时候对立面的一些 ...
- php 时间加减
<?php date_default_timezone_set('PRC'); //默认时区 echo "今天:",date("Y-m-d",time() ...
- freemarker 数据做加减计算
controller的部分: @Controller@RequestMapping("/ContactsFrameIndex")public class ContactsFrame ...
- Oracle中的日期加减
加法 select sysdate,add_months(sysdate,12) from dual; --加1年 select sysdate,add_months(sysdate ...
- php如何在某个时间上加一天?一小时? 时间加减
<?php date_default_timezone_set('PRC'); //默认时区 echo "今天:",date("Y-m-d",time() ...
随机推荐
- 【LuoguP3270】[JLOI2016] 成绩比较
题目链接 题目描述 G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M-1的整数.一位同学在必修课上可以获得的分数是1到Ui中的一个整数. ...
- springboot自定义异常数据
一.源码分析 自定义异常数据之前我们先看看一下源码 上述代码意思是如果你没有提供就使用springboot提供的类 这是springboot提供的异常属性类,我们想要自 ...
- 6389. 【NOIP2019模拟2019.10.26】小w学图论
题目描述 题解 之前做过一次 假设图建好了,设g[i]表示i->j(i<j)的个数 那么ans=∏(n-g[i]),因为连出去的必定会构成一个完全图,颜色互不相同 从n~1染色,点i的方案 ...
- System.currentTimeMillis和System.nanoTime()
ns(nanosecond):纳秒, 时间单位.一秒的10亿分之一,即等于10的负9次方秒.常用作 内存读写速度的单位. 1纳秒=0.000001 毫秒 1纳秒=0.00000 0001秒 jav ...
- Android使用命令行操作数据库
所有的应用程序本地文件都存放在/data/data/目录下 C:\Users\nicole>adb shell * daemon not running. starting it now on ...
- uploadify上传插件参数的一些设置
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- struct files_struct
内核利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表.当程序打开一个现有文件或者创建一个新文件时,内 ...
- TypeScript快速笔记(一)
刚学习TypeScript,但因为马上要用,主要是寻求先快速上手,而后再求精. 推荐学习网站: 1)https://www.runoob.com/typescript/ts-tutorial.html ...
- Python编程:从入门到实践—类
创建类 #!/usr/bin/env python# --*-- encoding:utf-8 --*-- class Dog(): """一次模拟小狗的简单尝试&quo ...
- Mysql数据库密码忘记的解决办法
密码忘记——破解密码 跳过授权方式,直接登录!! 1.以管理员身份打开cmd 2.停掉mysql服务端 C:\WINDOWS\system32>net stop mysql MySQL 服务正在 ...