版权声明:本人菜鸟一只,如文章有错误或您有高见,请不吝赐教 https://blog.csdn.net/qq_41138935/article/details/83759244
代码大部分是相同的,不是很简洁,原谅我是小白。
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
char ac[10005];
char bc[10005];
int arr[10005];
int brr[10005];
int crr[10005];
int add1(){
int maxv=max(strlen(ac),strlen(bc));
int t=0;
for(int i=0;i<maxv+1;i++){
crr[i]=arr[i]+brr[i]+t;
if(crr[i]>=10){
t=crr[i]/10;
crr[i]=crr[i]%10;
}else{
t=0;
}
}
if(crr[maxv]!=0)
cout<<crr[maxv];
for(int i=maxv-1;i>=0;i--){
cout<<crr[i];
}
cout<<endl;
}
int sub2(){ //A负 B正
int flag=1; //答案正负,1为正,0为负
if(strlen(ac)-1>strlen(bc))
flag=0;
else if(strlen(ac)-1==strlen(bc)){
int i;
for(i=0;i<strlen(bc);i++){
if(ac[i+1]>bc[i]){
flag=0;
break;
}
else if(ac[i+1]<bc[i]){
flag=1;
break;
}
}
if(i>=strlen(bc)){
cout<<0<<endl;
return 0;
}
}else
flag=1;
if(flag){ //B大
for(int i=0;i<strlen(bc);i++){
brr[i]-=arr[i];
if(brr[i]<0){
brr[i]+=10;
brr[i+1]-=1;
}
}
int len=strlen(bc)-1;
while(brr[len]==0) len-=1;
for(;len>=0;len--)
cout<<brr[len];
}else{ //A大
for(int i=0;i<strlen(ac)-1;i++){
arr[i]-=brr[i];
if(arr[i]<0){
arr[i]+=10;
arr[i+1]-=1;
}
}
int len=strlen(ac)-2;
cout<<"-";
while(arr[len]==0) len-=1;
for(;len>=0;len--)
cout<<arr[len];
}
}
int sub3(){ //A正 B 负
int flag=1; //答案正负,1为正,0为负
if(strlen(ac)>strlen(bc)-1)
flag=1;
else if(strlen(ac)==strlen(bc)-1){
int i;
for(i=0;i<strlen(ac);i++){
if(ac[i]>bc[i+1]){
flag=1;
break;
}
else if(ac[i]<bc[i+1]){
flag=0;
break;
}
}
if(i==strlen(ac)){
cout<<0<<endl;
return 0;
}
}else
flag=0;
//
if(flag){ //A大
for(int i=0;i<strlen(ac);i++){
arr[i]-=brr[i];
if(arr[i]<0){
arr[i]+=10;
arr[i+1]-=1;
}
}
int len=strlen(ac)-1;
while(arr[len]==0) len-=1;
for(;len>=0;len--)
cout<<arr[len];
}else{ //B大
for(int i=0;i<strlen(bc)-1;i++){
brr[i]-=arr[i];
if(brr[i]<0){
brr[i]+=10;
brr[i+1]-=1;
}
}
cout<<"-";
int len=strlen(bc)-2;
while(brr[len]==0) len-=1;
for(;len>=0;len--)
cout<<brr[len];
}
}
int add4(){
int maxv=max(strlen(ac),strlen(bc));
int t=0;
for(int i=0;i<maxv;i++){
crr[i]=arr[i]+brr[i]+t;
if(crr[i]>=10){
t=crr[i]/10;
crr[i]=crr[i]%10;
}else{
t=0;
}
}
cout<<'-';
if(crr[maxv-1]!=0)
cout<<crr[maxv-1];
for(int i=maxv-2;i>=0;i--){
cout<<crr[i];
}
cout<<endl;
}
int main(){
scanf("%s",ac);
scanf("%s",bc);
memset(arr,0,sizeof(arr));
memset(brr,0,sizeof(brr));
memset(crr,0,sizeof(crr));
if(ac[0]!='-'&&bc[0]!='-'){ //A B都为正
int y=0;
for(int i=strlen(ac)-1;i>=0;i--){
arr[y++]=ac[i]-'0';
}
y=0;
for(int i=strlen(bc)-1;i>=0;i--){
brr[y++]=bc[i]-'0';
}
add1();
}else if(ac[0]=='-'&&bc[0]!='-'){ //A负 B正
int y=0;
for(int i=strlen(ac)-1;i>0;i--){
arr[y++]=ac[i]-'0';
}
y=0;
for(int i=strlen(bc)-1;i>=0;i--){
brr[y++]=bc[i]-'0';
}
sub2();
}else if(ac[0]!='-'&&bc[0]=='-'){ //A正 B负
int y=0;
for(int i=strlen(ac)-1;i>=0;i--){
arr[y++]=ac[i]-'0';
}
y=0;
for(int i=strlen(bc)-1;i>0;i--){
brr[y++]=bc[i]-'0';
}
sub3();
}else{ //A B都为负
int y=0;
for(int i=strlen(ac)-1;i>0;i--){
arr[y++]=ac[i]-'0';
}
y=0;
for(int i=strlen(bc)-1;i>0;i--){
brr[y++]=bc[i]-'0';
}
add4();
}
return 0;
}
别人家的:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char aa[100010],bb[100010];
int a[100010],b[100010],c[100010];
int main()
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
scanf("%s%s",aa,bb);
int la=strlen(aa);
int lb=strlen(bb);
for(int i=la-1,j=0;i>0;i--) //反转字符串(不包含 首个字符);
a[j++]=aa[i]-'0';
if(aa[0]=='-')
{
for(int i=0;i<la-1;i++) //把 首字符 填入a[]数组中;
a[i]=-a[i];
}
else
a[la-1]=aa[0]-'0';
for(int i=lb-1,j=0;i>0;i--)
b[j++]=bb[i]-'0';
if(bb[0]=='-')
{
for(int i=0;i<lb-1;i++)
b[i]=-b[i];
}
else
b[lb-1]=bb[0]-'0';
int lc=max(la,lb);
int p,r=0;
for(int i=0;i<lc;i++)
{
p=a[i]+b[i]+r;
r=p/10;
c[i]=p%10;
}
if(r)
c[lc++]=r;
while(lc>1&&c[lc-1]==0) //略过 前面的0;
lc--;
int flag=0;
if(c[lc-1]>=0) //A,B相加为正;
{
flag=1;
for(int i=0;i<lc;i++)
{
while(c[i]<0)
{
c[i+1]--;
c[i]+=10;
}
}
}
else
{
flag=-1;
for(int i=0;i<lc;i++)
{
while(c[i]>0)
{
c[i+1]++;
c[i]-=10;
}
}
}
if(flag<0)
printf("-");
while(lc>1&&c[lc-1]==0)
lc--;
for(int i=lc-1;i>=0;i--)
printf("%d",abs(c[i]));
printf("\n");
}
解析:
数据表示:
如果
A输入为- 1 2 3 4 5,那么在int a数组中则用-5 -4 -3 -2 -1 0表示,
B输入1 2 3 4 5,那么在 int b数组中则用 5 4 3 2 1 表示,
数据计算:
用数组a+数组b中的每一个元素,注意进位。
扫描二维码关注公众号,回复:
4003450 查看本文章
判断c数组最后一个元素正负确定输出的正负,并进行进位或退位操作。
最后记得输出的是abs(c[i]),c[i]的绝对值。考虑A=-111,B=-222,C中是-3-3-3,根据最后一个元素取正负,在取C中每个元素的绝对值。答案-333