1.位数的确定:假设c用来保存大数据a与大数据b的差,那么c的长度len = max(lena,lenb)
2.进位处理:
if(a[i] < b[i]) { a[i+1]--; a[i] = a[i] + 10; } c[i] = a[i] - b[i];
3.判断数的大小
int compare(char s1[],char s2[]){ if(strlen(s1)>strlen(s2)) return 1; if(strlen(s1)<strlen(s2)) return -1; for(int i=strlen(s1)-1;i>=0;i--){ if(s1[i]>s2[i]) return 1; if(s1[i]<s2[i]) return -1; }
源码
#include <stdio.h> #include <string.h> #define Max 3000 void gminus(char s1[],char s2[]); void compare(char s1[],char s2[]); int max(int a,int b); int main() { char s1[Max]; char s2[Max]; scanf("%s %s",s1,s2); gminus(s1,s2); } void gminus(char s1[],char s2[]){ int flag; int a[Max]; int b[Max]; int c[Max]={0}; int lena=strlen(s1); for(int i;i<lena;i++) a[i]=s1[lena-i-1]-'0'; int lenb=strlen(s2); for(int i;i<lenb;i++) b[i]=s2[lenb-i-1]-'0'; int len=max(lena,lenb); flag=compare(s1,s2); if(flag==0){ putchar('0'); } if(flag==1){ for(int i=0;i<len;i++){ if(a[i]<b[i]){ a[i+1]--; a[i]+=10; } c[i]=a[i]-b[i]; } while(c[len-1]==0) len--; for(int i=len-1;i>=0;i--){ if(c[i]==0&&len>1) len--; else break; } for(int i=len-1;i>=0;i--) printf("%d",c[i]); } if(flag==-1){ for(int i=0;i<len;i++){ if(b[i]<a[i]){ b[i+1]--; b[i]+=10; } c[i]=b[i]-a[i]; } while(c[len-1]==0) len--; for(int i=len-1;i>=0;i--){ if(c[i]==0&&len>1) len--; else break; } putchar('-'); for(int i=len-1;i>=0;i--) printf("%d",c[i]); } } void compare(char s1[],char s2[]){ if(strlen(s1)>strlen(s2)) return 1; if(strlen(s1)<strlen(s2)) return -1; for(int i=strlen(s1)-1;i>=0;i--){ if(s1[i]>s2[i]) return 1; if(s1[i]<s2[i]) return -1; } return 0; } int max(int a,int b){ if(a>b) return a; else return b; }
以上代码仅供参考