大数加减乘除取模
来源:互联网 发布:sqlserver查看sa密码 编辑:程序博客网 时间:2024/05/30 04:46
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 20000
int a1[MAX+20];
int a2[MAX+20];
char b1[MAX+20];
char b2[MAX+20];
int aresult[MAX*2+20],flag=0;
int add(char *b1,char *b2)
{
inti,j,flag=0;
memset(a1,0,sizeof(a1)); //将数组中所有内容置0
memset(a2,0,sizeof(a2));
intlen1=strlen(b1);
intlen2=strlen(b2);
j=0; //把字符串数组数据存入整型数组
for(i=len1-1;i>=0;i--)
a1[j++]=b1[i]-'0';
j=0;
for(i=len2-1;i>=0;i--)
a2[j++]=b2[i]-'0';
for(i=0;i进行运算
{
a1[i]+=a2[i];
if(a1[i]>=10) //进位
{
a1[i]-=10;
a1[i+1]++;
}
}
for(i=MAX;i>=0;i--) //跳过多余的0
{
if(a1[i]!=0)
flag=1; //出现第一个非0,打开开关
if(flag)
printf("%d",a1[i]);
}
if(!flag) //防止结果0被跳过后什么也不输出
printf("0");
return0;
}
int minus(char *b1,char *b2)
{
inti,j=0,flag=0,key=0;
memset(a1,0,sizeof(a1)); //将数组中所有内容置0
memset(a2,0,sizeof(a2));
intlen1=strlen(b1);
intlen2=strlen(b2);
if(len1判断大小
key=1;
if(len1==len2)
for(i=0;i
{
if(b1[i]
{
key=1;
break;
}
elseif(b1[j]==b2[j])
j++;
else
break;
}
if(!key) //若被减数大,正常进行
{
j=0; //把字符串数组数据存入整型数组
for(i=len1-1;i>=0;i--)
a1[j++]=b1[i]-'0';
j=0;
for(i=len2-1;i>=0;i--)
a2[j++]=b2[i]-'0';
}
if(key) //若被除数小,交换减数、被减数位置
{
j=0; //把字符串数组数据存入整型数组
for(i=len1-1;i>=0;i--)
a2[j++]=b1[i]-'0';
j=0;
for(i=len2-1;i>=0;i--)
a1[j++]=b2[i]-'0';
}
for(i=0;i进行运算
{
a1[i]-=a2[i];
if(a1[i]<0) //借一位
{
a1[i]+=10;
a1[i+1]--;
}
}
if(key) //如果被减数小,加负号
printf("-");
for(i=MAX;i>=0;i--) //跳过多余的0
{
if(a1[i]!=0)
flag=1; //出现第一个非0,打开开关
if(flag)
printf("%d",a1[i]);
}
if(!flag) //防止结果0被跳过后什么也不输出
printf("0");
return0;
}
int add1(char *b1,char *b2)
{
if(b1[0]=='-'&& b2[0]!='-')
minus(b2,b1+1);
if(b1[0]!='-'&& b2[0]=='-')
minus(b1,b2+1);
if(b1[0]=='-'&& b2[0]=='-')
{
printf("-");
add(b1+1,b2+1);
}
if(b1[0]!='-'&& b2[0]!='-')
add(b1,b2);
}
int minus1(char *b1,char *b2)
{
if(b1[0]=='-'&& b2[0]!='-')
{
printf("-");
add(b1+1,b2);
}
if(b1[0]!='-'&& b2[0]=='-')
add(b1,b2+1);
if(b1[0]=='-'&& b2[0]=='-')
minus(b2+1,b1+1);
if(b1[0]!='-'&& b2[0]!='-')
minus(b1,b2);
}
int mul(char *b1,char *b2)
{
inti,j,flag=0;
memset(a1,0,sizeof(a1)); //将数组中所有内容置0
memset(a2,0,sizeof(a2));
memset(aresult,0,sizeof(aresult));
intlen1=strlen(b1);
intlen2=strlen(b2);
j=0; //把字符串数组数据存入整型数组
for(i=len1-1;i>=0;i--)
a1[j++]=b1[i]-'0';
j=0;
for(i=len2-1;i>=0;i--)
a2[j++]=b2[i]-'0';
for(j=0;j将第一个数的第j位乘以第二个数的第i位放到结果的第(i+j)位上
for(i=0;i
aresult[i+j]+=a1[j]*a2[i];
for(i=0;i处理进位
if(aresult[i]>9)
{
aresult[i+1]+=aresult[i]/10;
aresult[i]=aresult[i];
}
for(i=MAX;i>=0;i--) //跳过多余的0
{
if(aresult[i]!=0)
flag=1; //出现第一个非0,打开开关
if(flag)
printf("%d",aresult[i]);
}
if(!flag) //防止结果0被跳过后什么也不输出
printf("0");
return0;
}
int mul1(char *b1,char*b2)
{
if(b1[0]=='-'&& b2[0]!='-')
{
printf("-");
mul(b1+1,b2);
}
if(b1[0]!='-'&& b2[0]=='-')
{
printf("-");
mul(b1,b2+1);
}
if(b1[0]=='-'&& b2[0]=='-')
mul(b1+1,b2+1);
if(b1[0]!='-'&& b2[0]!='-')
mul(b1,b2);
}
int sub(int *p,int *q,int len1,intlen2)//p[0]、q[0]为个位
{
inti;
if(len1先判断大小,若被除数小,直接返还-1
return-1;
if(len1==len2)
for(i=len1-1;i>=0;i--) //位数相同时,从最大位开始比较大小
{
if(p[i]
return -1;
elseif(p[i]>q[i])
break;
}
for(i=0;i减法运算,p-q后的数据放入p中
{
p[i]-=q[i];
if(p[i]<0)
{
p[i]+=10;
p[i+1]--;
}
}
for(i=len1;i>=0;i--)
{
if(p[i])
returni+1; //返回位数
}
return0; //若被除数等于除数,返回0
}
int div(char *b1,char *b2)
{
inti,j,flag=0;
intntime;
intleng1=strlen(b1);
intleng2=strlen(b2);
ntime=leng1-leng2;
memset(a1,0,sizeof(a1));
memset(a2,0,sizeof(a2));
memset(aresult,0,sizeof(aresult));
j=0;
for(i=leng1-1;i>=0;i--)
a1[j++]=b1[i]-'0';
j=0;
for(i=leng2-1;i>=0;i--)
a2[j++]=b2[i]-'0';
for(i=leng1-1;i>=0;i--) //被除数乘以十的次方,使结果和被除数长度相同
{
if((i-ntime)>=0)
a2[i]=a2[i-ntime];
else
a2[i]=0;
}
leng2=leng1; //结果与被除数长度相同
for(i=0;i<=ntime;i++) //从除数*10^(ntime)开始减减到不能减,再减去除数*10^(ntime-1)…………直至不能减去除数
{
while((j=sub(a1,a2+i,leng1,leng2-i))>=0)//循环相减
{
++aresult[ntime-i]; //每减一次,商的对应位加一
leng1=j;
}
}
for(i=MAX;i>=0;i--) //跳过多余的0
{
if(aresult[i]!=0)
flag=1; //出现第一个非0,打开开关
if(flag)
printf("%d",aresult[i]);//输出结果
}
if(!flag) //防止结果0被跳过后什么也不输出
printf("0");
return0;
}
int div1(char *b1,char *b2)
{
if(b1[0]=='-'&& b2[0]!='-')
{
printf("-");
div(b1+1,b2);
}
if(b1[0]!='-' && b2[0]=='-')
{
printf("-");
div(b1,b2+1);
}
if(b1[0]=='-'&& b2[0]=='-')
div(b1+1,b2+1);
if(b1[0]!='-'&& b2[0]!='-')
div(b1,b2);
}
int mod(char *b1,char *b2)
{
inti,j,flag=0;
intntime;
intleng1=strlen(b1);
intleng2=strlen(b2);
ntime=leng1-leng2;
memset(a1,0,sizeof(a1));
memset(a2,0,sizeof(a2));
j=0;
for(i=leng1-1;i>=0;i--)
a1[j++]=b1[i]-'0';
j=0;
for(i=leng2-1;i>=0;i--)
a2[j++]=b2[i]-'0';
for(i=leng1-1;i>=0;i--) //被除数乘以十的次方,使结果和被除数长度相同
{
if((i-ntime)>=0)
a2[i]=a2[i-ntime];
else
a2[i]=0;
}
leng2=leng1; //结果与被除数长度相同
for(i=0;i<=ntime;i++) //从除数*10^(ntime)开始减减到不能减,再减去除数*10^(ntime-1)…………直至不能减去除数
{
while((j=sub(a1,a2+i,leng1,leng2-i))>=0)//循环相减,减到最后不能再减的a1就是余数
{
leng1=j;
}
}
for(i=MAX;i>=0;i--) //跳过多余的0
{
if(a1[i]!=0)
flag=1; //出现第一个非0,打开开关
if(flag)
printf("%d",a1[i]);//输出余数
}
if(!flag) //防止结果0被跳过后什么也不输出
printf("0");
return0;
}
int mod1(char *b1,char *b2)
{
if(b1[0]=='-'&& b2[0]!='-')
{
printf("-");
mod(b1+1,b2);
}
if(b1[0]!='-'&& b2[0]=='-')
mod(b1,b2+1);
if(b1[0]=='-'&& b2[0]=='-')
{
printf("-");
mod(b1+1,b2+1);
}
if(b1[0]!='-'&& b2[0]!='-')
mod(b1,b2);
}
int main()
{
scanf("%s",b1);
scanf("%s",b2);
printf("加:");
add1(b1,b2);
printf("\n减:");
minus1(b1,b2);
printf("\n乘:");
mul1(b1,b2);
printf("\n除:");
div1(b1,b2);
printf("\n取模:");
mod1(b1,b2);
}
----徐瑞
0 0
- 大数加减乘除取模
- 大数(高精度)加减乘除取模
- C#大数加减乘除取模
- 大数/高精度加减乘除取模[收藏]
- 大数运算(加减乘除,取模,乘方)
- 大数(高精度)加减乘除取模运算
- 大数模板(加减乘除取模开方)
- 大数加减乘除取余
- 大数加减乘除取余
- 大数的加减乘除取余
- 大数取余的加减乘除
- 算法 大数计算:加减乘除,模,阶乘,进制转换(大数除法取余)
- 大数运算(加减乘除模)
- 大数加减乘除
- 大数加减乘除
- 大数加减乘除
- 大数加减乘除
- 大数加减乘除
- java 流(2)scanner 接收键盘输入
- 迭代
- 总结代码开发完成–> 同步、更新、上传SVN –>服务器上部署整个流程
- ReentrantLock实现原理深入探究
- Eclipse 自动生成作者时间等注释
- 大数加减乘除取模
- 【数据结构与算法】链表题目集合
- JavaScript绑定事件的方法[3种]
- 这样教育孩子
- PAT 1027. 打印沙漏
- 线程的处理
- 基于统计概率和机器学习的文本分类技术
- Odoo 8 绿色版在 CentOS 自动安装及以服务方式启动方法 原文地址:
- jquery版本问题