学了1个月了...分享一个刚做的大数加减的程序
程序代码:
#include <stdio.h> #include <string.h> #define MAXLINE 1024 #define ADD 1 #define SUB 2 #define HELP 3 int handelargs(char* str, int n) { int i = 0; while( i < n){ if (str[i] == '+') return ADD; if(str[i] == '-') return SUB; ++i; } } void reverse(char* str, int n) { int i,j; char temp; for(i=0,j=n-i-1;i<j; i++, j--) temp=str[i],str[i]= str[j],str[j]= temp; } void before_afte(char* str1, char** str2) { int i=0,j=strlen(str1),k=0; while(k<j){ k++; if(str1[k] == '+'){ str1[k] = '\0'; *str2 = str1+(k+1); } if(str1[k] == '-'){ str1[k] = '\0'; *str2 = str1+(k+1); } } /* while(str1[++i]!= '+') ; str1[i]='\0'; *str2 = str1+(i+1);*/ } void add(char* str) { int i,k=1,len1,len2; char str1[MAXLINE],*str2; strcpy(str1, str); before_afte(str1, &str2); len1 = strlen(str1); len2 = strlen(str2); reverse(str1, len1); reverse(str2, len2); if(len1<=len2){ for(i=0;i<len1;i++){ str2[i] += str1[i]-'0'; if(str2[i]>'9' && i<len2-1) str2[i]-=10,str2[i+1]++; while(i+k>=len1 && i+k<len2-1){ if(str2[i+k] > '9') str2[i+k]-=10,str2[i+k+1]++; ++k; } } if(str2[len2-1]>'9') str2[len2-1]-=10,str2[len2] = '1', str2[len2+1] = '\0'; reverse(str2,strlen(str2)); printf("%s",str2); } else{ for(i=0;i<len2;i++){ str1[i] += str2[i]-'0'; if(str1[i]>'9' && i<len1-1) str1[i]-=10, str1[i+1]++; while(i+k>=len2 && i+k<len1-1){ if(str1[i+k]>'9') str1[i+k]-=10, str1[i+k+1]++; ++k; } } if(str1[len1-1]>'9') str1[len1-1]-=10, str1[len1] = '1', str1[len1+1] = '\0'; reverse(str1, strlen(str1)); printf("%s",str1); } } void subtract(char* str) { int j=0,k=1,i,len1,len2; char str1[MAXLINE], *str2; strcpy(str1, str); before_afte(str1, &str2); len1 = strlen(str1); len2 = strlen(str2); reverse(str1, len1); reverse(str2, len2); if(len1<len2){ for(i=0; i<len1; i++){ str2[i]-=str1[i]-'0'; if(str2[i]<'0') str2[i]+=10, str2[i+1]--; while(i+k>=len1 && i+k<len2){ if(str2[i+k]<'0') str2[i+k]+=10, str2[i+k+1]--; k++; } } reverse(str2,strlen(str2)); while(str2[j++] == '0') ; printf("-%s",str2+(j-1)); } else if(len1>len2){ for(i=0;i<len2;i++){ str1[i]-=str2[i]-'0'; if(str1[i]<'0') str1[i]+=10, str1[i+1]--; while(i+k>=len2 && i+k<len1){ if(str1[i+k]<'0') str1[i+k]+=10, str1[i+k+1]--; k++; } } reverse(str1,strlen(str1)); while(str1[j++]== '0') ; printf("%s",str1+(j-1)); } else if(len1==len2){ reverse(str1, len1); reverse(str2, len2); if(strcmp(str1, str2)>0){ reverse(str1, len1); reverse(str2, len2); for(i=0;i<len2;i++){ str1[i]-=str2[i]-'0'; if(str1[i]<'0') str1[i]+=10, str1[i+1]--; } reverse(str1, strlen(str1)); while(str1[j++]== '0') ; printf("%s",str1+(j-1)); } else if(strcmp(str1, str2)==0){ printf("0"); } else if(strcmp(str1, str2)<0){ reverse(str1, len1); reverse(str2, len2); for(i=0;i<len2;i++){ str2[i]-=str1[i]-'0'; if(str2[i]<'0') str2[i]+=10, str2[i+1]--; } reverse(str2,strlen(str2)); while(str2[j++]=='0') ; printf("-%s",str2+(j-1)); } } } void help() { printf(" > a Digital + Digital ... Addition operations.\n"); printf(" > a Digital - Digital ... Subtraction."); } int main(int argc,char* argv[]) { char temp[MAXLINE]; int i,j=1,len; argc--; while(argc--){ strcat(temp,argv[j++]); } len=strlen(temp); switch(handelargs(temp,len)){ case ADD: add(temp); break; case SUB: subtract(temp); break; default: help(); } }