问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

单链表实现十进制大整数运算。

发布网友 发布时间:2023-11-06 12:18

我来回答

2个回答

热心网友 时间:2024-10-21 09:59

//
// File name : Main.cpp
//
// Code by : jiangyonghang
//
// Project name : SingleLinkedListAddMinus
//
// Create datetime: 2011-07-10 06:53:10
//

// Tested or implemented header
// ...

// C system headers
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#pragma warning(disable:4996)

// C++ system headers
// ...

// Headers from other projects
// ...

// Headers of current project
// ...

typedef struct DigitNode
{
int num;
struct DigitNode *higher_one;
}DigitNode;

typedef struct ListNumber
{
DigitNode *list;
unsigned int len;
int positive;
}ListNumber;

void InitNumber(ListNumber *number);
void ClearNumber(ListNumber *number);
int GetHighestDigit(ListNumber number);
void RemoveHighestDigit(ListNumber *number);
int NotLessThan(ListNumber first, ListNumber second);

ListNumber ReadNumber();
char ReadOperator();
int Input(ListNumber *first, char *operator_char, ListNumber *second);
void AppendAsSmallEnd(ListNumber *number, int new_digit);
void AppendAsBigEnd(ListNumber *number, int new_digit);

ListNumber Calculate(ListNumber first, char operator_char, ListNumber second);
ListNumber Add(ListNumber first, ListNumber second);
ListNumber Minus(ListNumber first, ListNumber second);
void PrintResult(ListNumber result);

int main()
{
ListNumber first_number;
ListNumber second_number;
ListNumber result;
char operator_char = '\0';

int ret_code = false;
InitNumber(&first_number);
InitNumber(&second_number);
InitNumber(&result);

while (1)
{
ret_code = Input(&first_number, &operator_char, &second_number);
if (ret_code)
{
result = Calculate(first_number, operator_char, second_number);
if (result.list)
{
printf("Calculation is done.\n");
PrintResult(result);
}
else
{
printf("Calculation is failed.\n");
break;
}
}
else
{
printf("Input is failed.\n");
break;
}

ClearNumber(&first_number);
ClearNumber(&second_number);
ClearNumber(&result);
}

return 0;
}

void InitNumber(ListNumber *number)
{
if (number)
{
number->len = 0;
number->list = NULL;
number->positive = true;
}
return;
}

void ClearNumber(ListNumber *number)
{
DigitNode *now = NULL;
if (!number)
return;

now = number->list;
while (now)
{
DigitNode *next = now->higher_one;
free(now);
now = NULL;
now = next;
}

number->list = NULL;
number->len = 0;
number->positive = true;
return;
}

int GetHighestDigit(ListNumber number)
{
const DigitNode *kNow = number.list;
if (0 == number.len)
return 0;

while (kNow->higher_one)
kNow = kNow->higher_one;

return kNow->num;
}

void RemoveHighestDigit(ListNumber *number)
{
DigitNode *now_top = number->list;
if (number->len <= 0)
return;

if (1 == number->len)
{
free(number->list);
number->len = 0;
number->positive = true;
}

while (now_top->higher_one->higher_one)
{
now_top = now_top->higher_one;
}
free(now_top->higher_one);
now_top->higher_one = NULL;
number->len--;

return;
}

int NotLessThan(ListNumber first, ListNumber second)
{
const DigitNode *kFirstHighestDigit = first.list;
const DigitNode *kSecondHighestDigit = second.list;

if (first.len > second.len)
return true;
if (first.len < second.len)
return false;
if (0 == first.len)
return true;
while (kFirstHighestDigit || kSecondHighestDigit)
{
if (GetHighestDigit(first) != GetHighestDigit(second) )
return GetHighestDigit(first) > GetHighestDigit(second);
kFirstHighestDigit = kFirstHighestDigit->higher_one;
kSecondHighestDigit = kSecondHighestDigit->higher_one;
}

return 0;
}

ListNumber ReadNumber()
{
ListNumber result;
DigitNode *new_digit = NULL;
char temp = '\0';

InitNumber(&result);

while (1)
{
if (scanf("%c", &temp) != 1)
break;

if (!isdigit(temp) )
{
if (result.list)
{
break;
}
else
{
continue;
}
}

AppendAsSmallEnd(&result, temp - '0');
}

return result;
}

char ReadOperator()
{
char temp;
while (1)
{
temp = getchar();
if (
(' ' == temp) ||
('\t' == temp) ||
('\r' == temp) ||
('\n' == temp)
)
continue;
break;
}
return temp;
}

int Input(ListNumber *first, char *operator_char, ListNumber *second)
{
ClearNumber(first);
*operator_char = 0;
ClearNumber(second);

*first = ReadNumber();
if (!first->list)
return false;

*operator_char = ReadOperator();
if (
(*operator_char != '+') &&
(*operator_char != '-')
)
return false;

*second = ReadNumber();
if (!second->list)
return false;

return true;
}

void AppendAsSmallEnd(ListNumber *number, int new_digit)
{
if (number)
{
DigitNode *new_node = (DigitNode*)malloc(sizeof(DigitNode) );
if (new_node)
{
new_node->num = new_digit;
new_node->higher_one = number->list;
number->list = new_node;
number->len++;
}
}

return;
}

void AppendAsBigEnd(ListNumber *number, int new_digit)
{
if (number)
{
if (0 == number->len)
{
AppendAsSmallEnd(number, new_digit);
}
else
{
DigitNode *add_position = number->list;
while (add_position->higher_one)
add_position = add_position->higher_one;

add_position->higher_one = (DigitNode*)malloc(sizeof(DigitNode) );
if (add_position->higher_one)
{
add_position->higher_one->num = new_digit;
add_position->higher_one->higher_one = NULL;
number->len++;
}
}
}

return;
}

ListNumber Calculate(ListNumber first, char operator_char, ListNumber second)
{
ListNumber result;

InitNumber(&result);

if ('+' == operator_char)
result = Add(first, second);
else if ('-' == operator_char)
result = Minus(first, second);

while (0 == GetHighestDigit(result) )
{
if (result.len > 1)
{
RemoveHighestDigit(&result);
}
else
{
break;
}
}

return result;
}

ListNumber Add(ListNumber first, ListNumber second)
{
ListNumber result;
int upper_left = 0;

const DigitNode *kFirstDigit = first.list;
const DigitNode *kSecondDigit = second.list;

InitNumber(&result);

while (kFirstDigit || kSecondDigit || upper_left)
{
if (kFirstDigit)
{
upper_left += kFirstDigit->num;
kFirstDigit = kFirstDigit->higher_one;
}
if (kSecondDigit)
{
upper_left += kSecondDigit->num;
kSecondDigit = kSecondDigit->higher_one;
}

AppendAsBigEnd(&result, upper_left % 10);

upper_left /= 10;
}

return result;
}

ListNumber Minus(ListNumber first, ListNumber second)
{
ListNumber result;
int minus_mark = 0;
const DigitNode *kFirstNode = NULL;
const DigitNode *kSecondNode = NULL;

InitNumber(&result);

if (!NotLessThan(first, second) )
{
ListNumber temp = first;
first = second;
second = temp;
result.positive = false;
}

kFirstNode = first.list;
kSecondNode = second.list;

while (kFirstNode)
{
int first_digit = 0;
int second_digit = 0;
if (kFirstNode)
first_digit = kFirstNode->num;
if (kSecondNode)
second_digit = kSecondNode->num;
if (first_digit - minus_mark >= second_digit)
{
AppendAsBigEnd(&result, first_digit - minus_mark - second_digit);
minus_mark = 0;
}
else
{
AppendAsBigEnd(&result, first_digit - minus_mark + 10 - second_digit);
minus_mark = 1;
}
kFirstNode = kFirstNode->higher_one;
if (kSecondNode)
kSecondNode = kSecondNode->higher_one;
}

return result;
}

void PrintResult(ListNumber result)
{
char *output = (char*)malloc((result.len + 1) * sizeof(char) );
int i = 0;
const DigitNode *kNow = NULL;
if (!result.positive)
putchar('-');

i = result.len;
output[i] = '\0';
kNow = result.list;
i--;
for (; i >= 0; i--)
{
if (!kNow)
{
break;
}

output[i] = '0' + kNow->num;
kNow = kNow->higher_one;
}

if (i < 0)
puts(output);
else
puts("Print failed!");
free(output);
return;
}

需要注释的话请追问……注释太多未必好懂追问给注释吧

追答注释太多超过百度*了
已将答案发布到我空间“软件发布”分类

热心网友 时间:2024-10-21 09:59

#include <stdio.h>
#include <string.h>
int main()
{
char s[150];
int i,sum[600],b[600],lenth,j,c,t;
memset(sum,0,sizeof(sum)); //把sum[i]所有的位全部置为0..能看懂不?~~
scanf("%s",s); //输入字符串1
lenth=strlen(s);
i=500;
j=lenth-1;
memset(b,0,sizeof(b));
while(j>=0)
b[i--]=s[j--]-'0';//把字符转变成数字.最后一个字符在i=500位置.倒数第二个在i=499,依此类推.存在b[i]中
i=500;
c=0;
while(i!=100) //实现b[i]跟sum[i]个对个相加.进位啥啥啥的...从最后往前加.因为要对齐嘛.
{
t=sum[i]+b[i]+c;
sum[i]=t%10;
c=t/10;
i--;
}
scanf("%s",s);//第二个字符串.操作跟上面一样的.
lenth=strlen(s);
i=500;
j=lenth-1;
memset(b,0,sizeof(b));
while(j>=0)
b[i--]=s[j--]-'0';
i=500;
c=0;
while(i!=100)
{
t=sum[i]+b[i]+c;
sum[i]=t%10;
c=t/10;
i--;
}
i=1;
while(sum[i]==0) //前面多余的0不输出.
i++;
while(i<=500)
printf("%d",sum[i++]); //从不为0处往后一直输出.
printf("\n");
return 0;
}追问哥你这是单链表吗?而且只有加法没有减法。

追答晕..写得兴起,不知所以了.呵呵.
单链表的话应该可以把对应的数组 a[i]改成*(a+i);这个倒是容易..减法的话,还要改代码......累了~~~~~写了好久,等有心人帮忙改下罗.呵呵.

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
做了好乱的梦,求解! ae缺少p1效果是要装什么插件? ...荣耀》中“网络诊断”居然可以测定酒店有无摄像头,这是好事吗? 七叶一枝花花苞里面的红米是什么 q了是什么意思? ...Q就可以,格式也没错,也只几十K,别人发给我都可以,哪里出问题了... 显的么说友Q在微 ?Q上新示怎让在说我空里动间的态不更好博 诺诗兰户外品牌怎么样 新隋唐英雄传张卫健萧妃是刘小庆吗 红尖椒和朝天椒介绍!红尖椒和朝天椒哪个辣? 我爱你 用俄语怎么写??616 俄语,我喜欢你,怎么手写5 天津碧桂园金誉府怎么样?好不好?值不值得买? 天津碧桂园中心怎么样?好不好?值不值得买?1 天津碧桂园天樾怎么样?好不好?值不值得买?1 苏轼小时候的故事。7 求 三菱重工 海尔kx4空调说明书,手控板使用说明书。13 从哈西站到农大怎么走 oppa59好还是华为6x好?1 现在新注册的要怎样才能不被封号171 新注册的怎么养不会被封76 射手座个性座右铭158 射手座的座右铭是什么?222 你好,我想问下浦发的信用卡和招行的卡相对来说那个好些?现在我...1 想办张信用卡,在济南,办工行的好还是招行的好呢? 浦发,招行,交行,中信,办储蓄卡综合起来哪家比较好? 惠普笔记本BIOS密码忘记,但现在可以进系统10 到工行,建行,农行,招商,办卡,哪个比较好点?9 HP笔记本BIOS密码忘记了怎么办,想重装系统,选择启动方式...10 HP 笔记本电脑如何清除 BIOS 密码3 逆战月劵怎么捐战队资金8 自动档的车还在行驶过程中,突然直接从D档挂至P挡,这样会对汽...88 什么样的女人不能娶?149 冬天,发财树会不会冻死 发财树冻了能缓过来么1 怎样选择合适的干洗店位置?34 如何选择正确干洗品牌 开干洗店是要如何选择好的地址 我去年办了一张农行的信用卡,因为别的原因一直都没还起, 现在我的信誉... 哪些女人不能娶,列十种195 选择考研的人都是什么心态? 比亚迪双离合变速箱d档行驶中误操作挂入p档 对变速箱伤害大吗 刚注册的,要什么养,要养多久才不被封132 联想lp3pro是主动降噪吗 深圳市金美迪实业有限公司怎么样?1 深圳市斯美迪实业有限公司怎么样? 数学,英语,科学.问初中科学包括哪些学科 世界地理关于冰岛的题。以及冰岛常考的地理知识14 初中理科都有哪些科目3085 苏轼小时候的生活如何?