#include <stdio.h> #include <malloc.h> #include <string.h> #define N 100 int main() { int i; bool flag = false;//判断结果是否为负数 bool flag_0 = false;//判断前导0 char s1[N],s2[N]; printf("请输入被减数:\n"); scanf("%s",s1); printf("请输入减数:\n"); scanf("%s",s2); int len1 = strlen(s1); int len2 = strlen(s2); int len = (len1>len2 ? len1:len2)+1;//多出的1是为了添加'-' if(len1<len2 || len1==len2&&strcmp(s1,s2)<0)//如果被减数比减数长度小或者两者长度相同,但被减数值小于减数值,则结果为负数 flag = true; char *a = (char*)malloc(sizeof(char)*len1); char *b = (char*)malloc(sizeof(char)*len2); char *c = (char*)malloc(sizeof(char)*len); memset(c,len);//全置为0 for(i=0;i<len1;i++) a[i] = s1[len1-1-i]-'0';//a[0]是最低位 for(i=0;i<len2;i++) b[i] = s2[len2-1-i]-'0'; if(flag)//如果结果是负数 { for(i=0;i<len1;i++)//以被减数长度为判决条件,每一位用减数减去被减数 c[i]=b[i]-a[i]; for(i=len1;i<len2;i++)//剩下的位数用减数补齐 c[i]=b[i]; } else { for(i=0;i<len2;i++)//以减数长度作为判决条件,每一位用被减数去减减数 c[i]=a[i]-b[i]; for(i=len2;i<len1;i++)//剩下的位数用被减数补齐 c[i]=a[i]; } for(i=0;i<len;i++) { if(c[i]<0)//如果为负,则向上一位借1,上一位减1,自己加10 { c[i+1]--; c[i]+=10; } } printf("大数相减结果为:\n"); if(flag)//如果结果是负数 { for(i=len-1;i>=0;i--) { if(flag_0) { c[i]+='0'; printf("%c",c[i]); } else if(c[i]!=0) { c[i+1] = '-';//第一个非0元素前面置负号 printf("%c",c[i+1]); c[i]+='0'; printf("%c",c[i]); flag_0 = true; } } } else//结果非负数 { for(i=len-1;i>=0;i--) { if(flag_0) { c[i]+='0'; printf("%c",c[i]); } else if(c[i]!=0) { c[i]+='0'; printf("%c",c[i]); flag_0 = true; } } } printf("\n"); free(a); free(b); free(c); a=NULL; b=NULL; c=NULL; return 0; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。