51nod 1005 大数加法
2017-07-01 23:41
246 查看
给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586
468711654886
Output示例
537643802472
这个交上去有几组数据超时,大佬们是用python和java写的 我好尴尬的。。
2017年7月20号更新
自己一直没有搞懂的问题,还是小伙伴来纠正的,自己数据范围开小了,少掉了一个0,就这一个问题 ,代码是很棒哒!
Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586
468711654886
Output示例
537643802472
这个交上去有几组数据超时,大佬们是用python和java写的 我好尴尬的。。
2017年7月20号更新
自己一直没有搞懂的问题,还是小伙伴来纠正的,自己数据范围开小了,少掉了一个0,就这一个问题 ,代码是很棒哒!
#include<stdio.h> #include<stdlib.h> #include<string.h> #define N 10000+10 char str1 ,str2 ; int num1 ,num2 ; void Conversion(char *p,int l,int *num,int *j) { int i; for(i = l-1; i >= 0;i --) { num[(*j)++] = p[i]-'0'; } } void Addition(int *num1,int *num2,int *i,int l)//加法 { int j = 0; while(j < l) { num1[(*i)++]+=num2[j++]; } j = 0; while(j < l||num1[j]) { if( num1[j] >= 10) { num1[j]%=10; num1[++j]+= 1; } else ++j; } *i = j; } void Judge(int *num1,int *num2,int *find,int l1,int l2,int *max) { //正数大find为1,负数大find为3 //num1大为max=1,num2大为max = 2 l1--; l2--; if(*find == 1)//num1为负数 { if(l1>l2)//l1大于l2时,num1大 { *find = 3; *max = 1; } else if(l1 == l2)//l1==l2即两数长度相等时 { while(num1[l1]==num2[l2]&&num1[l1]&&num2[l2]) { l1--; l2--; } if(num1[l1] > num2[l2])//num1大 { *find = 3; *max = 1; } else//num2大 { *find = 1; *max = 2; } } else//l2小于l2 { *find = 1; *max = 2; } } else if(*find==2)//num2为负数 { if(l2 > l1) { *find = 3; *max = 2; } else if(l2 == l1) { while(num1[l1]==num2[l2]&&num1[l1]&&num2[l2]) { l1--; l2--; } if(num1[l1] >= num2[l2]) { *find = 1; *max = 1; } else { *find = 3; *max = 2; } } else { *find = 1; *max = 1; } } else//两数同号 { if(l1 > l2) *max = 1; else if(l1 == l2) { while(num1[l1]==num2[l2]&&l1>0&&l2>0) { l1--; l2--; } if(num1[l1] >= num2[l2]) { *max = 1; } else { *max = 2; } } else *max = 2; } } void Subtraction(int *num1,int *num2,int l1,int l2,int *i)//减法 {//*i指向差的长度 int j = 0; while(j < l2) { num1[(*i)++] -= num2[j++]; } j = l1-1; while( num1[j]== 0&&j)//去掉前导0 { j--; } if( j == 0) { *i = 1; return; } j = 0; while(j < l1) { if( num1[j] < 0) { num1[j]+= 10; num1[++j]-= 1; } else ++j; } *i = j; } void Print(int *num,int find,int n)//输出函数 { n--;//先自减1 if(find == 3)//如果运算后有负号,输出负号 printf("-"); while(num ==0&&n)//去掉前导0 { n--; } if(n==0) { printf("%d\n",num );//只如果全部为0,只输出一个0并结束函数 return; } while(n >= 0) { printf("%d",num ); n--; } printf("\n"); } void Count(char str1[],char str2[],int *num1,int *num2)//完成大数相加 { int i,j,k; int m,n; int l1,l2; int find=0; int max; max = 0; char *p = str1,*q = str2; l1 = strlen(str1); l2 = strlen(str2); p = str1; find = 0; if(str1[0] == '-')//若str1为负数,find标记为1,并去掉负号 { find = 1; p++; l1--; } q = str2; if(str2[0] == '-')//若str2为负数,find标记为2,并去掉负号 { find = 2; q++; l2--; } e009 if(str1[0]=='-'&&str2[0] == '-')//若同为负,find标记为3,并去掉负号 find = 3; i = 0; Conversion(p,l1,num1,&i);//把字符转为数字 j = 0; Conversion(q,l2,num2,&j); m = 0; if(find == 0||find == 3)//若两数同号 { Judge(num1,num2,&find,i,j,&max);//判断两者大小,用max做标记 if(max == 1)//若num1大 { Addition(num1,num2,&m,l1);//相加 Print(num1,find,m);//输出 } if(max == 2)//若num2大 { Addition(num2,num1,&m,l2); Print(num2,find,m); } } n = 0; if(find == 1||find == 2)//若两者异号 { Judge(num1,num2,&find,i,j,&max);//判断两数大小 if(max== 1) { Subtraction(num1,num2,i,j,&n);//相减 Print(num1,find,n);//输出 } else if(max == 2) { Subtraction(num2,num1,j,i,&n); Print(num2,find,n); } } } int main() { while(scanf("%s",str1)!=EOF) { scanf("%s",str2); memset(num1,0,sizeof(num1)); memset(num2,0,sizeof(num2)); Count(str1,str2,num1,num2);//完成大数相加 } return 0; }
相关文章推荐
- 51Nod-1005-大数加法
- 51Nod 1005 大数加法
- 51nod 1005 大数加法
- 51nod 1005 大数加法 大数运算
- 51nod 1005 大数加法
- 51Nod-1005 大数加法
- 51Nod - 1005 大数加法
- 51nod 1005 大数加法
- 51Nod-1005-大数加法
- 【51Nod】1005 大数加法
- 51nod 1005 大数加法
- 51Nod 1005 大数加法
- 51nod——1005 大数加法
- 【51nod】1005 大数加法
- 51nod 1005 大数加法(可为负数)
- 51nod_1005 大数加法
- 大数高精度加减乘除 51nod 1005 大数加法
- 51Nod-1005-大数加法
- 51Nod 1005 大数加法
- 51nod 1005 大数加法