两个长整数相加
本帖最后由 焦糖橙子 于 2021-8-6 18:55 编辑程序目标:实现任意长度的整数加法运算。
特殊要求:
1.将数字看成字符进行操作
2.要根据每次输入的长度,通过realloc来申请内存大小
{:10_272:}请问我这个代码有什么地方错了?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *get_s(void);
char *add(char *num1,char *num2);
char *add(char *num1,char *num2)//实现两个字符串相加
{
char*last1=num1;
char*last2=num2;
char*result;
int count1=0,count2=0;
int mark=0,temp=0,max,digit=0;//mark表示是否需要进位,digit用来表示正在计算的位数
while(*last1++)
{
count1++;
}
last1-=2;
while(*last2++)
{
count2++;
}
last2-=2;
max=count1>count2?count1:count2;
result=(char*)realloc(result,max*sizeof(char));
for(;count1!=0&&count2!=0;count1--,count2--)//将num1与num2相同的位数相加
{
if(mark=0)
{
temp=*last1+*last2-'0'-'0';
last1--;
last2--;
}
else
{
temp=*last1+*last2-'0'-'0'+1;
last1--;
last2--;
}
if(temp>9)
{
result=temp-10;
mark=1;
digit++;
}
else
{
result=temp;
mark=0;
digit++;
}
}
if(count1==0)//将剩下的位数赋值到result
{
for(;count2!=0;count2--)
{
if(mark=0)
{
temp=*last2-'0';
last2--;
}
else
{
temp=*last2-'0'+1;
last2--;
}
if(temp>9)
{
result=temp-10;
mark=1;
digit++;
}
else
{
result=temp;
mark=0;
digit++;
}
}
}
else
{
for(;count1!=0;count1--)
{
if(mark=0)
{
temp=*last1-'0';
last1--;
}
else
{
temp=*last1-'0'+1;
last1--;
}
if(temp>9)
{
result=temp-10;
mark=1;
digit++;
}
else
{
result=temp;
mark=0;
digit++;
}
}
}
return result;
}
char *get_s(void)//获取字符串
{
char ch;
char*num;
int count=0;
if((ch=getchar())!='\n')
{
num=(char*)realloc(num,(count+1)*sizeof(char));
num=ch;
get_s();
}
return num;
}
int main(void)
{
char*num1;
char*num2;
char*result;
printf("请输入一个整数:");
num1=get_s();
printf("请输入一个整数:");
num2=get_s();
result=add(num1,num2);
printf("计算结果是:%s\n", result);
return 0;
}
好长
temp=*last1+*last2-'0'-'0';
这减两次啥意思 两个函数全是错的,get_s 函数无法构成递归
add 函数,你能说一说你的实现思路吗?
(add 函数简单的看了看,很有可能是错的)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *get_s(void);
char *add(char *num1,char *num2);
char *add(char *num1,char *num2)//实现两个字符串相加
{
char*last1=num1;
char*last2=num2;
char*result;
int count1=0,count2=0;
int mark=0,temp=0,max,digit=0;//mark表示是否需要进位,digit用来表示正在计算的位数
while(*last1++)
{
count1++;
}
last1-=2;
while(*last2++)
{
count2++;
}
last2-=2;
max=count1>count2?count1:count2;
result=(char*)realloc(result,max*sizeof(char));
for(;count1!=0&&count2!=0;count1--,count2--)
{
if(mark=0)
{
temp=*last1+*last2-'0'-'0';
last1--;
last2--;
}
else
{
temp=*last1+*last2-'0'-'0'+1;
last1--;
last2--;
}
if(temp>9)
{
result=temp-10;
mark=1;
digit++;
}
else
{
result=temp;
mark=0;
digit++;
}
}
return result;
}
char *get_s(void)//获取字符串
{
char ch;
//char*num;
char*num = NULL;
int count=0;
if((ch=getchar())!='\n')
{
num=(char*)realloc(num, 2);
num=ch;
num='\0';
} else {
num=(char*)realloc(num, 1);
num='\0';
return num;
}
char *next = get_s();
size_t size = strlen(next);
if(size) {
num = realloc(num, size + count);
strcat(num, next);
}
free(next);
return num;
}
int main(void)
{
char*num1;
char*num2;
char*result;
printf("请输入一个整数:");
num1=get_s();
printf("请输入一个整数:");
num2=get_s();
printf("%s\n", num1);
printf("%s\n", num2);
/*
result=add(num1,num2);
printf("计算结果是:%s\n", result);
*/
//free(result);
free(num2);
free(num1);
return 0;
}
申请了内存,就要释放,alloc/free 应该成对出现
逻辑不对 + 变量不初始化 + 内存申请了不释放 + 把 == 写成 =
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *get_s(void);
char *add(char *num1,char *num2);
char *add(char *num1,char *num2)//实现两个字符串相加
{
char*last1=num1;
char*last2=num2;
char*result = NULL;
int count1=0,count2=0;
int mark=0,temp=0,max,digit=0;//mark表示是否需要进位,digit用来表示正在计算的位数
while(*last1++)
{
count1++;
}
last1-=2;
while(*last2++)
{
count2++;
}
last2-=2;
max=count1>count2?count1:count2;
max += 1; // 进位
max += 1; // '\0'
result=(char*)realloc(result,max*sizeof(char));
result = '\0';
digit = max - 1 - 1;
for(;count1!=0&&count2!=0;count1--,count2--)
{
/*
//if(mark=0)
if(mark == 0)
{
temp=*last1+*last2-'0'-'0';
last1--;
last2--;
}
else
{
temp=*last1+*last2-'0'-'0'+1;
last1--;
last2--;
}
*/
temp = (*last1-- - '0') + (*last2-- - '0') + mark;
mark = 0;
if(temp > 9) {
mark = 1;
temp -= 10;
}
result = temp + '0';
/*
if(temp>9)
{
result=temp-10;
mark=1;
digit++;
}
else
{
result=temp;
mark=0;
digit++;
}
*/
}
char *p = NULL;
char *pe = NULL;
if(count1 != 0) p = last1, pe = num1 - 1;
if(count2 != 0) p = last2, pe = num2 - 1;
while(p != pe) {
temp = (*p-- - '0') + mark;
mark = 0;
if(temp > 9) {
mark = 1;
temp -= 10;
}
result = temp + '0';
}
if(mark) result = mark + '0';
if(digit == 0) { // 之前多申请了一个进位,全部字符串前移一位
for(size_t i = 0; i < max - 1; ++i) {
result = result;
}
result = realloc(result, max - 1);
}
return result;
}
char *get_s(void)//获取字符串
{
char ch;
//char*num;
char*num = NULL;
int count=0;
if((ch=getchar())!='\n')
{
num=(char*)realloc(num, 2);
num=ch;
num='\0';
} else {
num=(char*)realloc(num, 1);
num='\0';
return num;
}
char *next = get_s();
size_t size = strlen(next);
if(size) {
num = realloc(num, size + count);
strcat(num, next);
}
free(next);
return num;
}
int main(void)
{
char*num1;
char*num2;
char*result;
printf("请输入一个整数:");
num1=get_s();
printf("请输入一个整数:");
num2=get_s();
result=add(num1,num2);
printf("计算结果是:%s\n", result);
free(result);
free(num2);
free(num1);
return 0;
}
改一下
之前多申请了一个进位,全部字符串前移一位
之前多申请了一个进位,全部字符前移一位
万千只cnm 发表于 2021-8-6 19:02
好长
这减两次啥意思
因为那个last1和last2都是字符串,都要减去'\0'再相加才是数字相加 人造人 发表于 2021-8-6 19:25
两个函数全是错的,get_s 函数无法构成递归
add 函数,你能说一说你的实现思路吗?
(add 函数简单的看了 ...
我想的思路是,先通过get_s函数获取两个字符串数组,然后传递到add里
add:存储的字符串数组个位数在末尾,首先找到个位的地址赋值给last
然后个位相加,若结果>9则mark=1表示需要进位,若<=9则mark=0,表示不需要进位
然后last1--;last2--;再进行十位数的运算,通过mark判断是否需要再加一。
然后以此类推,到最高位,如果num1的位数>num2的位数,则num2已经没有更大的位数
即后续只要把num1中的字符赋值给result 就行了, 人造人 发表于 2021-8-6 23:19
逻辑不对 + 变量不初始化 + 内存申请了不释放 + 把 == 写成 =
感谢回答,那个进位那里我写的时候确实思路很乱,看了你的感觉清晰多了{:10_254:}
页:
[1]