大数是算法语言中的数据类型无法表示的数,其位数超过最大数据类型所能表示的范围,所以,在处理大数问题时首先要考虑的是怎样存储大数,然后是在这种存储方式下其处理的实现方法。
一般情况下大数的存储是采用字符数组来存储,即将大数当作一个字符串来存储,而对其处理是按其处理规则在数组中模拟实现。
七 百位大数。
此次实验要求利用数组实现两个百位大数(共有100位数字)的加、减、乘法的运算。
实现下列三个函数的功能(以下函数应在fun.h中声明,在fun.c中实现)
函数原型:
/*实现两个大数的相加*/
char* add(char* data, char* addend, char* result);
/*实现两个大数的相减*/
char* minus(char* data, char* sub, char* result);
/*实现两个大数的相乘*/
char* multiply(char* data, char* mult, char* result);
在给出的程序框架中完成实验题目。
mylib.c包括此次实验的程序框架。
(在给出的程序框架中补充设计并完成实验。)
注:检验计算结果是否正确可利用提供的 test.exe 文件。
在mylib.exe和test.exe文件中输入相同的种子则会产生相同的随机大数。可以用test.exe产生的结果和mylib.exe对照结果检验对错。
请注意其中test.exe文件的输出格式和框架规定的输出格式有所不同。
提示:
字符型与整型转换
1.可以模拟笔算加减乘的过程,用数组储存大数;
2.可以用atoi和itoa函数;
3.对于一位整数的整型转换为字符型:
例:
char c;
int i = 9;
c = i+’0’;
printf(“%c”, c);
main.c
/* 姓名:**** 班级:软件三班 学号:**** 功能:百位大数 时间:2012.12.2 */#include <stdio.h>#include <stdlib.h>#include <string.h>#include "fun.h"#define N 100/* 产生随机的大数 */void create(char* num, unsigned seed); /*seed 为随机种子*/char result[2 * N] = {
'\0'};int main(void){ char num[N];//多出符号位 char n[N]; //设定随机种子 unsigned int seed; printf("Please input a rand seed:"); scanf("%u", &seed); printf("\nThe seed is %u\n", seed); //产生随机大数 create(num, seed); create(n, seed+1); printf("***********************************************\n"); printf("num: %s\n n : %s\n", num, n); //调用加法 add(num, n, result); printf("num + n = %s\n", result); //调用减法 minus(num, n, result); printf("num - n = %s\n", result); //调用乘法 multiply(num, n, result); printf("num * n = %s\n", result); system("pause"); return 0;}void create(char num[], unsigned seed){ int i = 0, x = 0; int times, flag = 1; srand(seed); times = rand() % (N - 2) + 1;//避免溢出 if(rand() % 2)//随机生成负数{ num[i] =