回复 29楼 点线面
你用:1111
1111
试试
欢迎来到我的博客:http://blog..cn/noisunyuhong
#include <stdio.h> #include <stdlib.h> #include <string.h> void rollback(char *ScL,int length_a,int length_b) //对于长度短的字符串前面填充零 { ScL[length_a+1]='\0'; while(length_a>=0) { if(length_b>=0) ScL[length_a]=ScL[length_b]; else ScL[length_a]='0'; length_a--; length_b--; } } void Sub(char a[],char b[],char *sum,int length_a) //减法核心 { int i; for(i=length_a-1;i>=0;i--) { sum[i] = a[i]-b[i]+sum[i]; if( sum[i] <0) { sum[i] += +10; if(i>0) sum[i-1]--; } } } void prinf(char sum[],int length_a,char flag) //输出部分 { int length_b; if(flag) putchar('-'); for(length_b =0 ;sum[length_b]==0&&(length_b+1<length_a);length_b++); //处理前面零 for(;length_b <length_a;length_b++) //输出 { printf("%d",sum[length_b]); } } int main() { char a[10]={0},b[10]={0},sum[10]={0}; int length_a,length_b; gets(a); gets(b);//获取字符串 length_a = strlen(a), length_b = strlen(b);//获取字符串长度 if(length_a >length_b) //两组长度对齐,前面不足补零 { rollback(b,length_a-1,length_b-1); } else { rollback(a,length_b-1,length_a-1); length_a = length_b; } if(strcmp(a,b)>=0) //比加法增加了字符串 { Sub(a,b,sum,length_a); prinf(sum,length_a,0); } else { Sub(b,a,sum,length_a); prinf(sum,length_a,1); } system("pause"); return 0; }之前第一次发时候OK的,后期觉得还要更短就进行编辑,发觉越改越错,今次应该没有问题,
#include <stdio.h> #include <stdlib.h> #include <string.h> short int sum[1000],length=0;//sum为结果,length为位数的长短 int cmp(int a[],int b[],int a_length,int b_length){ int i; if(a_length>b_length)return 1;//如果a串长度比b串长度大,返回1 if(a_length<b_length)return -1;//如果a串长度比b串长度小,返回-1 for(i=a_length-1;i>=0;i--){ if(a[i]>b[i])return 1;//如果a串数值比b串数值大,返回1 if(a[i]<b[i])return -1;//如果a串数值比b串数值小,返回-1 } return 0;//如果两数相等,返回0 } int sub(int a[],int b[],int a_length,int b_length){ int flag,i;//flag位标记 length=a_length;//将a的长度赋给总长度 flag=cmp(a,b,a_length,b_length);//从cmp中获得两串信息 if(flag==0){ memset(a,0,sizeof(a));//将数组置0 return 0;//返回相等标记 } if(flag==1){//如果a串长度比b串长度大 或 如果a串数值比b串数值大,返回1 //减法核心 for(i=0;i<length;i++) { if(a[i]<b[i]) { a[i+1]--; a[i]+=10; } a[i]=a[i]-b[i]; while(a[length]==0)length--;//获取减去后的长度并返回1 } return 1; } //end if(flag==-1){//如果a串长度比b串长度小 或 如果a串数值比b串数值小,返回-1 for(i=0;i<b_length;i++){ if(b[i]<a[i]) { b[i+1]--; b[i]+=10; } a[i]=b[i]-a[i]; } length=b_length; while(a[length]==0)length--; return -1; } } int main(){ char a[500],b[500];//用来读入两个串 int A[500]={0},B[500]={0},i,k; int a_length,b_length; gets(a),gets(b);//获取两个数 a_length=strlen(a);//获取数字a的长度 b_length=strlen(b);//获取数字b的长度 for(i=0;i<a_length;i++) A[i]=a[a_length-i]-'0';//由数组A来保存获得的a每个字符的数值 for(i=0;i<b_length;i++) B[i]=b[b_length-i]-'0';//由数组B来保存获得的b每个字符的数值 if(cmp(A,B,a_length,b_length)==0)//判断两串是否相等 { printf("0\n"); //两数相等相减就等于0 system("pause"); return 0;//退出程序 } k=sub(A,B,a_length,b_length);//k为标记是否为负数 if(k==-1)//判断a-b是否是负数 printf("-");//是负数就在将要打印的数字前加上负号 for(i=length-1;i>=0;i--) printf("%d",A[i]);//打印相减后的结果,因为一开始没有将串倒置,所以倒着输出 system("pause"); return 0; }