给我一个实现高精度加法运算的C语言代码,要求考虑小数
时间: 2024-10-18 22:16:33 浏览: 21
在C语言中,实现高精度加法运算可以采用链表数据结构来存储大整数,并处理小数部分。以下是一个简单的示例,它使用了动态内存分配和两个结构体分别表示整数和分数(即小数)。请注意,这个例子仅用于教学目的,实际应用中可能需要更复杂的算法和错误检查。
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct IntNode {
int digit;
struct IntNode* next;
} IntNode;
typedef struct FractionNode {
double numerator;
int denominator;
struct FractionNode* next;
} FractionNode;
// 分离整数和小数部分
void separate(IntNode* num, FractionNode** frac) {
*frac = NULL;
if (num == NULL || num->next == NULL) return;
int whole = 0;
for (IntNode* curr = num; curr != NULL; curr = curr->next)
whole = 10 * whole + curr->digit;
// 小数部分从第二个节点开始
*frac = (FractionNode*)malloc(sizeof(FractionNode));
(*frac)->denominator = 10;
(*frac)->numerator = (double)(whole - num->digit);
(*frac)->next = num->next;
}
// 加法运算
IntNode* add(IntNode* num1, IntNode* num2, FractionNode* frac1, FractionNode* frac2) {
IntNode* result = (IntNode*)malloc(sizeof(IntNode));
result->digit = 0;
result->next = NULL;
int carry = 0;
for (; num1 != NULL || num2 != NULL || frac1 != NULL || frac2 != NULL;) {
int part1 = (num1 ? num1->digit : 0);
int part2 = (num2 ? num2->digit : 0);
double partfrac1 = frac1 ? frac1->numerator / (double)frac1->denominator : 0;
double partfrac2 = frac2 ? frac2->numerator / (double)frac2->denominator : 0;
int total = part1 + part2 + carry + partfrac1 + partfrac2;
carry = total / 10;
result->digit = total % 10;
result = (IntNode*)realloc(result, sizeof(IntNode) + sizeof(IntNode));
result->next = (IntNode*)malloc(sizeof(IntNode));
result = result->next;
if (frac1) {
frac1->numerator += carry * frac1->denominator;
if (frac1->numerator >= frac1->denominator) {
frac1->numerator -= frac1->denominator;
carry++;
}
frac1 = frac1->next;
}
if (frac2) {
frac2->numerator += carry * frac2->denominator;
if (frac2->numerator >= frac2->denominator) {
frac2->numerator -= frac2->denominator;
carry++;
}
frac2 = frac2->next;
}
if (carry == 0 && num1 == NULL && num2 == NULL && frac1 == NULL && frac2 == NULL) break;
num1 = num1 ? num1->next : NULL;
num2 = num2 ? num2->next : NULL;
}
return result;
}
int main() {
// 示例输入
IntNode* num1 = create_int(12345); // 创建一个表示12345的整数链表
IntNode* num2 = create_int(6789); // 创建另一个整数链表
FractionNode* frac1 = NULL;
FractionNode* frac2 = NULL;
separate(num1, &frac1);
separate(num2, &frac2);
IntNode* result = add(num1, num2, frac1, frac2);
printf("Result (integer): ");
print_int(result);
free(result);
free(frac1);
free(frac2);
return 0;
}
// 辅助函数,创建整数链表
IntNode* create_int(int value) {
IntNode* node = (IntNode*)malloc(sizeof(IntNode));
node->digit = value % 10;
node->next = create_int(value / 10);
return node;
}
// 辅助函数,打印整数链表
void print_int(IntNode* num) {
while (num) {
printf("%d", num->digit);
num = num->next;
}
}
阅读全文