C语言实现大数四则运算
一、简介
众所周知,C语言中INT类型是有限制,不能进行超过其范围的运算,而如果采用float类型进行运算,由于float在内存中特殊的存储形式,又失去了计算的进度。要解决整个问题,一种解决方法是通过字符串数组实现数据的存储,然后实现它们之间四则运算的函数。
二、数据结构
为了实现字符数组之间的运算,要考虑数值的正负性,数字的长度以及具体存储的数字
typedef struct num{
int len; //数值长度
char symbol; //数字正负形
int number[LEN]; //数组
}NUM,*SNUM;
三、函数
整个程序使用了一下的函数
SNUM expToNum(char exp[]);//将输入字符串转换为对应结构体
void reverse(int a[],int len);//数组逆序
int compareAbs(SNUM left,SNUM right);//比较两数绝对值大小
SNUM anti_add(SNUM left,SNUM right);//元加法
SNUM anti_sub(SNUM left,SNUM right);//元减法
SNUM add(SNUM left,SNUM right); //加法
SNUM sub(SNUM left,SNUM right); //减法
SNUM multiply(SNUM left,SNUM right); //乘法
SNUM divide(SNUM left,SNUM right); //除法
SNUM mod(SNUM left,SNUM right);//求摸运算
函数的定义
SNUM multiply(SNUM left,SNUM right){
//left作为被乘数,right作为乘数
SNUM mul = (struct num*)malloc(sizeof(struct num));
int i,j;
for(i=;i<LEN;i++){
mul->number[i]=;
}
if(left->symbol==right->symbol){
mul->symbol='+';
}else{
mul->symbol='-';
}
for(i=;i<right->len;i++){
for(j=;j<left->len;j++){
mul->number[i+j]+=left->number[j]*right->number[i];
}
}
// //进位化简
int len = left->len+right->len-; //长度
//
for(i=;i<len;i++){
mul->number[i+]+=mul->number[i]/;
mul->number[i]%=;
if(i==len-){
if(mul->number[i+]!=){ //还存在高位
len++;
}else{ //进位完毕,退出
break;
}
}
}
// //舍去多余0位
for(i=len-;i>=;i--){
if(mul->number[i]==){
len--;
}else{
break;
}
}
if(len==){
len=;
}
mul->len=len;
free(left);
free(right);
return mul;
}
//减一个数等于加上一个数的相反数
SNUM sub(SNUM left,SNUM right){
right->symbol=(right->symbol=='+'?'-':'+');
return add(left,right);
}
//比较两数绝对值大小
int compareAbs(SNUM left,SNUM right){
if(left->len>right->len){ //left的位数更多
return ;
}else if(left->len<right->len){ //right的位数更多
return -;
}else{
int i=left->len-;
while(i>=){ //从高位开始比较
if(left->number[i]>right->number[i]){
return ;
}
if(left->number[i]<right->number[i]){
return -;
}
i--;
}
return ; //两者绝对值相等
}
}
SNUM expToNum(char exp[]){
SNUM temp=(struct num*)malloc(sizeof(struct num));
int locan=;
//确定正负号
if(exp[]=='+'||exp[]=='-'){
temp->symbol=exp[];
locan++;
}else{
temp->symbol='+';
}
//输入到数组
int count=;
while(exp[locan]!='\0'){
temp->number[count]=exp[locan]-'';
locan++;
count++;
}
int i=count;
for(i=count;i<LEN-;i++){
temp->number[i]=;
}
temp->len=count;
//数组逆序从个位开始计算
reverse(temp->number,temp->len);
return temp;
}
//数组逆序
void reverse(int a[],int len){
int i,temp;
for(i=;i<len/;i++){
temp = a[i];
a[i] = a[len--i];
a[len--i] = temp;
}
}
//元加法,假设left和right都为正数或0
SNUM anti_add(SNUM left,SNUM right){
int i=;
while(i<left->len||i<right->len){
int sum=;
sum=left->number[i]+right->number[i];
if(sum>=){
left->number[i]=sum%;
left->number[i+]+=sum/; //进位
}else{
left->number[i]=sum; //不进位
}
i++;
}
if(left->number[i]!=){
i+=;
}
left->len=i;
return left;
}
//实现正数或负数的加法
SNUM add(SNUM left,SNUM right){
SNUM temp;
if(left->symbol==right->symbol){
temp = anti_add(left,right);
}else{
if(compareAbs(left,right)>=){
temp = anti_sub(left,right);
}else{
temp = anti_sub(right,left);
}
}
return temp;
}
//元减法,假设left>=right,left和right均为正数或0
SNUM anti_sub(SNUM left,SNUM right){
int i=;
int count=;
while(i<left->len){
int temp = left->number[i]-right->number[i];
if(temp<){
left->number[i+]-=;
left->number[i]=temp+; //退位
}else{
left->number[i]=temp;
}
count+=;
i++;
}
//舍掉多余的0
for(i=count-;i>=;i--){
if(left->number[i]==){
count--;
}else{
break;
}
}
if(count==){
count++;
}
left->len=count;
return left;
}
C语言实现大数四则运算的更多相关文章
- 大数四则运算之加法运算--------C语言版(未考虑负数)
/* 声明两个字符数组,用于存储大数,声明两个整数型数组便于计算,将字符数组中的元素转换为对应整数存于整数数组中,将低位放在整数数组低位,便于对齐计算 判断是否有进位,计算结果高位先输出,从数组后往前 ...
- 大数四则运算之减法运算-----c语言版
/* 分三种情况: 1.减数长度大于被减数 交换减数与被减数,输出负号,方便减 2.减数长度等于被减数(分三种情况) a.减数大于被减数,类似1情况1 b.减数等于被减数,两数相等,直接输出0,完成. ...
- 大数四则运算java(转)
// 大数的四则运算 #include <iostream> #include <string> #include <algorithm> using namesp ...
- C语言#自动生成四则运算的编程
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <time.h> ...
- C语言求大数的阶乘
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,该如何计算? 当一个数很大时,利用平常的方法是求不出来它的阶乘的,因为数据超出了范围.因此我们要用数组来求一个大数的阶乘,用数组的每位表示结果的 ...
- C语言:大数取余
大数取余数(数组) 今天做学校的oj时遇到一题,问题可见一下截图: 查遍各大论坛,都没有遇到合适的方法,普通方法不可用,要采用数组的形式. 被除数超过long long类型,不能采用常规思路,否则会出 ...
- C语言:大数求和
点击获取题目 1410: [蓝桥杯]高精度加法 时间限制: 1 Sec 内存限制: 256 MB提交: 28 解决: 20[状态] [提交] [命题人:外部导入] 题目描述 输入两个整数a和b,输 ...
- java实现超大整数加减乘除四则运算
原理: 用数组存储数字,按照计算法则进行运算. 代码: package com.hdwang; import java.util.regex.Matcher; import java.util.reg ...
- C 语言学习的第 05 课:C 语言基础(01)
C语言程序中的绝大部分应该记录在以.c作为扩展名的文件里,这种文件叫做C语言 程序的源文件. C语言中还包括以.h作为扩展名的文件,这种文件叫做头文件. C语言中的四则运算: 加:+ 减:- 乘 ...
随机推荐
- Java网络编程(读书笔记)
部分片段: 早期web服务器由于Http链接短暂而有所掩盖,由于web页面和嵌入式的图片一般很小(至少与通常通过FTP获取软件包要小很多),由于web浏览器在获取各个文件后挂起连接,而不是一次保持数分 ...
- C++ namespace命名空间
1.什么是命名空间 简而言之:划片取名 加入有两个公司,公司A里面有一个员工小明,公司B里面有一个员工小明,两个公司在同一栋楼.这时,你去找小明,你再楼下大喊:“小明!你给我下来!”,这时两个小明都会 ...
- ES之八:elasticsearch2.x下的JAVA API示例
D:\soft\elasticsearch\elasticsearch-2.1.0\lib package com.dxz.es; import java.net.InetAddress; impor ...
- jquery的load()事件和ajax中load()方法的区别
load事件 当图像加载时,改变 div 元素的文本: $("img").load(function(){ $("div").text("Image ...
- IE, Firefox下,checkbox的钩钩一旦勾上,画面再刷新,钩钩还是勾上的解决方案
如题,IE, Firefox下,checkbox的钩钩一旦勾上,画面再刷新,钩钩还是勾上的解决方案 <input type="checkbox" />加上属性auto ...
- js实现手机号身份证等加星(*)号
下面来为各位整理了一些关于js实现手机号身份证等加星(*)号代码了,在js不足时我们还补充了php实现手机号身份证等加星(*)号的函数,有兴趣的一起来看看. 有时候为了不让用户的手机号码和身份证号 ...
- PHP流程控制 - if 语句
PHP - if 语句 if 语句用于仅当指定条件成立时执行代码. 语法 if (条件) { 条件成立时要执行的代码; } 如果当前时间小于 20,下面的实例将输出 "Have a good ...
- Solr --- Group查询与Facet区别
简介 facet的查询结果主要是分组信息:有什么分组,每个分组包括多少记录:但是分组中有哪些数据是不可知道的,只有进一步搜索. group则类似于关系数据库的group by,可以用于一个或者几个字段 ...
- Executor框架(二)Executor 与 ExecutorService两个基本接口
一.Executor 接口简介 Executor接口是Executor框架的一个最基本的接口,Executor框架的大部分类都直接或间接地实现了此接口. 只有一个方法 void execute(Run ...
- oracle10偶然性卡住登陆
连接数据库异常:登陆数据库后以"conn /as sysdba"方式登陆正常,数据库轻载,无压力:于是检查数据库的监听器,输入"lsntctl services" ...