很久以前写的啦
记得写了好久好久一直卡在特例的数据上面
想起都心塞

那时候变量和数组的取名对我来说简直是个大难题啊
完全乱来 abcdef就一路排下来
自己看的时候都搞不懂分别代表什么
好在后来英语学的越来越好了
这也算是学c++的附带好处叭
而且格式也写得非常丑…
我翻出来的时候各种字符都挨在一起密密麻麻…
真是搞不懂那时候怎么想的
稍微补了下空格但其它地方就懒得改啦
见谅

不过我当时居然写了注释…
太神奇了
^^

其实只要自己手动模拟一下小学的竖式乘加减和除法
思考一下 下标关系 和 进位处理 就会发现还是很简单的啦
坑的地方我现在还依稀记得两个
一个是减法 被减数比减数小的情况要特判加负号
一个是前缀零的处理 但是要特判答案为0的情况

还有做除法的时候 被除数比除数小或者除数为0的时候可以直接输0 节约时间

不过我除法做的方法不太常规…虽然说我也不知道常规应该咋写^^

加法

#include<bits/stdc++.h>
#include<cstring>
using namespace std; char s1[300] , s2[300] ;
int c[300] , ans , t , a[300] , b[300] ; int main()
{ memset(a , 0 , sizeof(a));
memset(b , 0 , sizeof(b));
memset(c , 0 , sizeof(c));
gets(s1) ;
gets(s2) ;
int len1 = strlen(s1) , len2 = strlen(s2) , len3 = 1 ;
for(int i = 1 ; i <= len1 ; ++ i )
a[i] = s1[len1 - i] - '0' ;
for(int i = 1 ; i <= len2 ; ++ i )
b[i] = s2[len2 - i] - '0' ;
while(len3 <= len1 || len3 <= len2)
{
ans = a[len3] + b[len3] ;
c[len3] = (ans + t) % 10 ;
t = (ans + t) / 10 ;
++ len3 ;
}
if(t != 0)
c[len3] = t ;
while(c[len3] == 0 && len3 > 1) -- len3 ; //删除前导0
for(int i = len3 ; i >= 1 ; -- i )
cout << c[i] ;
return 0;
}

减法

#include<bits/stdc++.h>
using namespace std; char s1[300] , s2[300] , s3[300] ;
int c[300] , ans , t=0 , a[300] , b[300] ; int main()
{
memset(a , 0 , sizeof(a)) ;
memset(b , 0 , sizeof(b)) ;
memset(c , 0 , sizeof(c)) ;
gets(s1) ;
gets(s2) ;
int len1 = strlen(s1) , len2 = strlen(s2) , len3 = 1 , len4 ;
//if(len2>len1||(len2==len1)&&(strcmp(s1,s2)<0))
//strcpy(s3,s1),strcpy(s1,s2),strcpy(s2,s3),cout<<"-",len4=len1,len1=len2,len2=len4; //这里是处理减数比被减数大的情况
for(int i = 1 ; i <= len1 ; ++ i ) a[i] = s1[len1 - i] - '0' ;
for(int i = 1 ; i <= len2 ; ++ i ) b[i] = s2[len2 - i] - '0' ;
while(len3 <= len1 || len3 <= len2)
{
ans = a[len3] - b[len3] - t ;//t是前一个数借的数
t = 0 ;
if(ans < 0) ans += 10 , t = 1 ;
c[len3] = ans ;
++ len3 ;
}
while(c[len3] == 0 && len3 > 1) -- len3 ; //前导0
for(int i = len3 ; i >= 1 ; -- i )
cout << c[i];
return 0;
}

乘法

#include<bits/stdc++.h>
#include<cstring>
using namespace std; char s1[500] , s2[500] ;
int c[500] , ans , t , a[500] , b[500] ; int main()
{ memset(a , 0 , sizeof(a));
memset(b , 0 , sizeof(b));
memset(c , 0 , sizeof(c));
gets(s1);
gets(s2);
int len1 = strlen(s1) , len2 = strlen(s2) ;
for(int i = 1 ; i <= len1 ; ++ i )
a[i] = s1[len1 - i] - '0' ;
for(int i = 1 ; i <= len2 ; ++ i )
b[i] = s2[len2 - i] - '0' ;
for(int i = 1 ; i <= len1 ; ++ i ){
t=0;
for(int j = 1 ; j <= len2 ; ++ j ){
c[i + j - 1] += a[i] * b[j] + t;
t = c[i + j - 1] / 10;
c[i + j - 1] %= 10;
}
c[ i+ len2] = t;
}
int len3 = len1 + len2 ;
while(c[len3] == 0 && len3 > 1) -- len3 ;
for(int i = len3 ; i >= 1 ; -- i)
cout << c[i] ;
return 0;
}

除法(带余)

#include<bits/stdc++.h>
using namespace std; char s1[300] , s2[300] , s3[300];
int c[300] , ans , t=0 , a[300] , b[300] , f[300] , d , e , p; int main()
{
memset(a , 0 , sizeof(a));
memset(b , 0 , sizeof(b));
memset(c , 0 , sizeof(c));
gets(s1) ;
gets(s2) ;
int len1 = strlen(s1) , len2 = strlen(s2) , len3 ;
for(int i = 1 ; i <= len1 ; i++) a[i] = s1[len1 - i] - '0' ;
for(int i = 1 ; i <= len2 ; i++) b[i] = s2[len2 - i] - '0' ;
d = len1 ;
if(len2 > len1 || (len1 == len2) && (strcmp(s1,s2) < 0) )//如果除数比被除数小直接输0;
{
cout << 0 ;
return 0 ;
}
if(len1 == 1 && a[1] == 0)//如果被除数为0直接输0;
{
cout << 0 ;
return 0 ;
}
while(d != 0)
{
memset(f , 0 , sizeof(f)) ;
while(a[d] == 0 && d > 0) -- d ;//d为当前被除部分的左端
if(d < 1) break ;
e = d - len2 + 1 ;
p = 1 ;
for(int j = 1 ; j <= len2 ; ++ j){//把当前被除的部分放到f数组里与除数比较大小
f[j] = a[e+j-1] ;
if(f[j] < b[j]) p = 0 ;
else if(f[j] > b[j]) p = 1 ;//用p来讨论大小
}
if(p == 0) -- e ;//e为当前被除部分的右端
if(e <= 0) break ;//在商加1之前讨论被除数有没有除完
for(int j = 1 ; j <= len2 ; ++ j){
int k = e + j - 1 ;
a[k] -= b[j] ;
if(a[k] < 0) a[k] += 10 , -- a[k+1] ;
}//只减一次 剩下的部分参与下一次循环
++ c[e] ;
}
++ d ;
while(c[len1] == 0 && len1 > 0) -- len1 ;
while(a[d] == 0 && d > 1) -- d ;
for(int i = len1 ; i >= 1 ; -- i)
cout << c[i] ;
//for(int i=d;i>=1;i--)
// cout<<a[i];//这里还可以输出余数
return 0; }

c++ 高精度 加减乘除 四则运算 代码实现的更多相关文章

  1. c++的正整数高精度加减乘除

    数值计算之高精度加减乘除 一.      高精度正整数的高精度计算 1.加法 2.减法 减法和加法的最大区别在于:减法是从高位开始相减,而加法是从低位开始相加 3.乘法:用高精度加法实现 l 乘法的主 ...

  2. Qt之加减乘除四则运算-支持负数

    一.效果展示 如图1所示,是简单的四则运算测试效果,第一列为原始表达式,第二列为转换后的后缀表达式,冒号后为结果.表达式支持负数和空格,图中是使用了5组测试数据,测试结果可能不全,如大家发现算法有问题 ...

  3. poj 1348 Computing (四个数的加减乘除四则运算)

    http://poj.org/problem?id=1348 Computing Time Limit: 1000MS   Memory Limit: 10000K Total Submissions ...

  4. java实现超大整数加减乘除四则运算

    原理: 用数组存储数字,按照计算法则进行运算. 代码: package com.hdwang; import java.util.regex.Matcher; import java.util.reg ...

  5. 用Java位运算实现加减乘除四则运算

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6412875.html 感谢博客:http://blog.csdn.net/itismelzp/article/ ...

  6. C++高精度加减乘除模板

    其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的. 其中高精度除法返回一对string,分别表示商和余数. 代码: #include <bits/stdc++.h> ...

  7. Python基础算法综合:加减乘除四则运算方法

    #!usr/bin/env python# -*- coding:utf-8 -*-#python的算法加减乘除用符号:+,-,*,/来表示#以下全是python2.x写法,3.x以上请在python ...

  8. c++四则运算代码

    //Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--& ...

  9. ACM高精度加减乘除模板

    [转]#include <iostream> #include <string> using namespace std; inline int compare(string ...

随机推荐

  1. ArrayList和LinkedList的共同点和区别

    ArrayList和LinkedList的相同点和不同点 共同点:都是单列集合中List接口的实现类.存取有序,有索引,可重复 不同点: 1.底层实现不同: ArrayList底层实现是数组,Link ...

  2. div里面放img

    div里面放img的时候 会出现包裹不住的情况,这个时候 只要将img { width:100%,height:100%  },就可以解决问题了

  3. Charles对移动APP抓包(https)

    1.下载安装Charles 2.设置代理 (1)查看默认端口:Proxy->Proxy Settings  在这个页面会看到HTTP Proxy的默认端口是8888 (2)查看当前电脑的IP:H ...

  4. python之类的相关名词解释

    变量:在类里面定义的变量,不必实例化即可调用 实例变量:在类里面定义的变量,必须实例化之后才可以调用 比如: 属性方法:调用时看起来像是一个变量,方法没有入参,可以变成一个属性方法 在方法上添加@pr ...

  5. UVa 1218 Perfect Service 完美的服务

    ***状态设计值得一看dp[u][0]表示u是服务器(以下v均指任意u的子结点,son指u的所有子结点)ap[u][0]=sum{dp[v][1]}+1//错误,服务器是可以和其他服务器相邻的dp[u ...

  6. 记忆化搜索(DFS+DP) URAL 1501 Sense of Beauty

    题目传送门 /* 题意:给了两堆牌,每次从首部取出一张牌,按颜色分配到两个新堆,分配过程两新堆的总数差不大于1 记忆化搜索(DFS+DP):我们思考如果我们将连续的两个操作看成一个集体操作,那么这个操 ...

  7. 162 Find Peak Element 寻找峰值

    峰值元素是指其值大于左右相邻值的元素.给定一个输入数组,其中 num[i] ≠ num[i+1],找到峰值元素并返回其索引.数组可能包含多个峰值,在这种情况下,返回到任何一个峰值所在位置都可以.你可以 ...

  8. JavaScript星级评分,仿百度,增强版

    JavaScript星级评分,仿百度,增强版 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" & ...

  9. 【转】Iconfont

    Iconfont Iconfont 是指用字体文件取代图片文件,来展示图标.特殊字体等元素的一种方法.很多网站都会用它,比如手淘.新浪微博等. 在使用它之前,先来了解一下它的优缺点: 优点:(1)文件 ...

  10. logging日志过滤和日志文件自动截取

    1.日志过滤 import logging class IgnoreFilter(logging.Filter): def filter(self,record): return "girl ...