关于大数加法的,进位出了点问题。。
程序代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXLINE 1024 #define ADD 1 #define SUBTRCT 2 int handel(char* str) { int i=0; int j=strlen(str); while(i<j){ ++i; if(str[i]== '+') return ADD; else if(str[i] == '-') return SUBTRCT; } } void before_afte_add(char* str1,char** str2) { int i=0,k=0,j; while(str1[i]!= '+') i++; j = i; while(str1[--i]== ' ') ; str1[i+1]='\0'; while(str1[++j]== ' ') ; *str2 = str1+(j); } void before_afte_sub(char* str1,char** str2) { int i=0,k=0,j; while(str1[i]!= '-') i++; j = i; while(str1[--i]== ' ') ; str1[i+1]='\0'; while(str1[++j]== ' ') ; *str2 = str1+(j); } void reverse(char* str, int n) { int i,j; char temp; for(i=0, j=n-1; i<j; i++, j--) temp=str[i], str[i]=str[j],str[j]=temp; } void add(char* str) /*主要是这里面的*/ { int i,len1,len2; char str1[MAXLINE]; char *str2; strcpy(str1,str); before_afte_add(str1,&str2); len1=strlen(str1); len2=strlen(str2); reverse(str1, len1); reverse(str2, len2); /*len1是数组str1的长度 len2是数组2长度 reverse是用来把数组前后的调转的*/ 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]++; } if(str2[len2-1]>'9') str2[len2-1]-=10,str2[len2]='1', str2[len2+1]='\0'; reverse(str2,strlen(str2)); printf("%s\n",str2); } else { for(i=0; i<len2; i++){ str1[i]+=str2[i]-'0'; if(str1[i]>'9') str1[i]-=10, str1[i+1]++; } reverse(str1, strlen(str1)); printf("%s", str1); } } void subtrct(char* str) { } int main() { int n, m = 0; char str[MAXLINE]; gets(str); switch(handel(str)){ case ADD: add(str); break; case SUBTRCT: subtrct(str); break; } }
这个程序运行时是如果输入了465465465456456 + 6546546546546544 输出前部分加后部分的值。
其他加数都没什么问题。。。不过一到999+1这样就出问题了。。。。本来应该是1000 由于进位不知道该怎么弄 变9:0了。。求高手指教指教
程序代码:
void add(char* str) { int i,len1,len2; char str1[MAXLINE]; char *str2; strcpy(str1,str); before_afte_add(str1,&str2); len1=strlen(str1); len2=strlen(str2); reverse(str1, len1); reverse(str2, len2); /* str1是数组1,str2是数组2 len1是数组1长度 len2是数组2长度 帮我看看下面加法运算有什么问题,输入999+1就出错了改要怎么改 */ 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]++; } if(str2[len2-1]>'9') str2[len2-1]-=10,str2[len2]='1', str2[len2+1]='\0'; reverse(str2,strlen(str2)); printf("%s\n",str2); } else { for(i=0; i<len2; i++){ str1[i]+=str2[i]-'0'; if(str1[i]>'9') str1[i]-=10, str1[i+1]++; } if(str1[len1-1]>'9') str1[len1-1]-=10,str1[len1]='1',str1[len1+1]='\0'; reverse(str1, strlen(str1)); printf("%s", str1); } }
[ 本帖最后由 clcqifeng 于 2012-3-7 17:57 编辑 ]