关于大数加法的,进位出了点问题。。
程序代码:#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 编辑 ]




