大数减法算法
2015-10-22 21:26
239 查看
输入两个大数,把两个大数各用字符数组存起来
用两个函数,一个加法函数,一个减法函数
总的程序为:
#include<stdio.h>
#include<string.h>
int ans[1003];
void zhuan(char *a,int *n)
{
int t=0;
int len=strlen(a);
if(a[0]=='-'){
t=1;
n[0]=1;
}
for(int i=t;i<len;i++)
n[len-i]=a[i]-'0';
}
bool dd(int *x,int *y)
{
int i=1000;
while(i--){
if(x[i]>y[i]) return 1;
if(x[i]<y[i]) return 0;
}
return 1;
}
void jian(int *x,int *y);
void jia(int *x,int *y)
{
if(x[0]){ // x 为负
x[0]=0;
jian(y,x);
return ;
}
if(y[0]){ // x 为负,y 为负
y[0]=0;
jian(x,y);
return ;
}
// x,y为正数
for(int i=1;i<1000;i++){
ans[i]=x[i]+y[i];
if(ans[i]>9){
ans[i]-=10;
x[i+1]++;
}
}
}
void jian(int *x,int *y)
{
if(y[0]){ // y 为负
y[0]=0;
jia(x,y);
return ;
}
if(x[0]){ // y 为负 ; x 为负
x[0]=0;
jia(x,y);
ans[0]=1;
return ;
}
if(!dd(x,y)){ // x, y 为正数 且 y大于x
jian(y,x);
ans[0]=1;
return ;
}
// x, y 为正数 且 x大于y
for(int i=1;i<1000;i++){
ans[i]=x[i]-y[i];
if(ans[i]<0){
ans[i]+=10;
x[i+1]++;
}
}
}
void pp(int *a)
{
if(a[0]) printf("-");
int i=1000;
for(;i>1;i--){
if(a[i]){
for(;i>1;i--)
printf("%d",a[i]);
}
}
printf("%d\n",a[1]);
}
int main()
{
char a[1000],b[1000];
int n[1000],m[1000];
while(~scanf("%s%s",a,b)){
memset(n,0,sizeof(n));
memset(m,0,sizeof(m));
memset(ans,0,sizeof(ans));
zhuan(a,n);
zhuan(b,m);
jian(n,m);
pp(ans);
}
return 0;
}
分析(以下用x,y来表示该两个数):
如果 x 负 y 负:负 - 负 = 若|x| > |y|,结果为负;反之为正
调用jian(x,y)函数,先判断 y 的正负,此处 y 为负,把 y 变为正,再调用jia(x,y),在该函数中,判断 x 为负,把 x 变为正,再回头调用jian(y,x),此时 x y 皆为正,再判断 x y 的大小,进行减法运算,注意结果的正负符号
如果 x 负 y 正:负 - 正 = -( 正 + 正 )
调用jian(x,y)函数,先判断 y 的正负,此处 y 为正,再判断 x ,x 为负,把 x 变为正,调用jia(x,y),结果为负
如果 x 正 y 正:正 - 正 =若x > y,结果为负;反之为正
判断 x,y 的大小,进行减法运算,注意结果的正负符号
如果 x 正 y 负:正 - 负 =( 正 + 正 )
先判断 y 的正负,此处 y 为负,把 y 变为正,再调用jia(x,y),结果为正
用两个函数,一个加法函数,一个减法函数
总的程序为:
#include<stdio.h>
#include<string.h>
int ans[1003];
void zhuan(char *a,int *n)
{
int t=0;
int len=strlen(a);
if(a[0]=='-'){
t=1;
n[0]=1;
}
for(int i=t;i<len;i++)
n[len-i]=a[i]-'0';
}
bool dd(int *x,int *y)
{
int i=1000;
while(i--){
if(x[i]>y[i]) return 1;
if(x[i]<y[i]) return 0;
}
return 1;
}
void jian(int *x,int *y);
void jia(int *x,int *y)
{
if(x[0]){ // x 为负
x[0]=0;
jian(y,x);
return ;
}
if(y[0]){ // x 为负,y 为负
y[0]=0;
jian(x,y);
return ;
}
// x,y为正数
for(int i=1;i<1000;i++){
ans[i]=x[i]+y[i];
if(ans[i]>9){
ans[i]-=10;
x[i+1]++;
}
}
}
void jian(int *x,int *y)
{
if(y[0]){ // y 为负
y[0]=0;
jia(x,y);
return ;
}
if(x[0]){ // y 为负 ; x 为负
x[0]=0;
jia(x,y);
ans[0]=1;
return ;
}
if(!dd(x,y)){ // x, y 为正数 且 y大于x
jian(y,x);
ans[0]=1;
return ;
}
// x, y 为正数 且 x大于y
for(int i=1;i<1000;i++){
ans[i]=x[i]-y[i];
if(ans[i]<0){
ans[i]+=10;
x[i+1]++;
}
}
}
void pp(int *a)
{
if(a[0]) printf("-");
int i=1000;
for(;i>1;i--){
if(a[i]){
for(;i>1;i--)
printf("%d",a[i]);
}
}
printf("%d\n",a[1]);
}
int main()
{
char a[1000],b[1000];
int n[1000],m[1000];
while(~scanf("%s%s",a,b)){
memset(n,0,sizeof(n));
memset(m,0,sizeof(m));
memset(ans,0,sizeof(ans));
zhuan(a,n);
zhuan(b,m);
jian(n,m);
pp(ans);
}
return 0;
}
分析(以下用x,y来表示该两个数):
如果 x 负 y 负:负 - 负 = 若|x| > |y|,结果为负;反之为正
调用jian(x,y)函数,先判断 y 的正负,此处 y 为负,把 y 变为正,再调用jia(x,y),在该函数中,判断 x 为负,把 x 变为正,再回头调用jian(y,x),此时 x y 皆为正,再判断 x y 的大小,进行减法运算,注意结果的正负符号
如果 x 负 y 正:负 - 正 = -( 正 + 正 )
调用jian(x,y)函数,先判断 y 的正负,此处 y 为正,再判断 x ,x 为负,把 x 变为正,调用jia(x,y),结果为负
如果 x 正 y 正:正 - 正 =若x > y,结果为负;反之为正
判断 x,y 的大小,进行减法运算,注意结果的正负符号
如果 x 正 y 负:正 - 负 =( 正 + 正 )
先判断 y 的正负,此处 y 为负,把 y 变为正,再调用jia(x,y),结果为正
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例