学了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();
}
}






