Question:
(1),用一个整型数组表示一个大数,数组的每个元素储存大数的一位数字,则实际的大数d表示为: d=a[k]*10的k-1次幂+a[k-1]*10的k-2次幂+......+a[2]*10+a[1] 其中a[0]保存该大数的位数.
(2),实现两个大数相乘.
(3),再此基础上实现两个大数相除
Solution:
/*
本程序假设所输入的大数均在20位以内,并且输入数字时候假定不出现非法情况(例如不存在这样情况123a78ty等)
这里只完成了大数的乘法运算
*/
#include "stdio.h"
#define MAX 21
void InputNumber(int []); //输入大数
void InitNumber(int []); //初始化用于存放结果的数组
void Multi(int [],int [],int []); //进行大数乘法
void singleMulti(int [],int,int []); //对大数乘以一位数的函数
void Add(int [],int []); //对结果进行错位相加
void printresult(int []); //输出结果
void main()
{
int largenumber1[MAX],largenumber2[MAX],mResult[2 * MAX -1];
//largenumber1[]和largenumber2[]表示要相乘的大数
//mResult[]表示结果存放的数组,显然其位数不会超过2 * (MAX - 1)
printf("Input the first number:/n");
InputNumber(largenumber1);
printf("Input the second number:/n");
InputNumber(largenumber2);
InitNumber(mResult);
Multi(largenumber1,largenumber2,mResult);
printf("The result is:/n");
printresult(mResult);
getchar();
}
void InputNumber(int largenumber[])
{
char numberchar;
int i = 0;
scanf("%c",&numberchar);
while(numberchar != '/n' && i < MAX) //最初输入大数用字符串表示
{
largenumber[++i] = numberchar - '0';
scanf("%c",&numberchar);
}
largenumber[0] = i; //largenumber[0]表示大数的有多少位
}
void InitNumber(int result[])
{
for(int i = 0; i < 2 * MAX - 1; i++)
result[i] = -1; //赋初值为-1非常高明
}
void Multi(int number1[],int number2[],int result[])
{
int i;
int temper[2 * MAX - 1];
for(i = number2[0]; i >= 1; i--) //number2[0]记录number2[ ]大数到底有多少位
{
singleMulti(number1,number2[i],temper);
Add(result,temper);
}
}
void singleMulti(int number1[],int number2,int temper[])
{
int i,t = 0,c = 2 * MAX - 2;
for(i = number1[0]; i >= 1; i--) //number2[0]记录number2[ ]大数到底有多少位
{
int tempernumber = number2 * number1[i];
temper[c--] = (tempernumber + t) % 10;
t = (int)((tempernumber + t) / 10);
}
if (t > 0)
{
temper[c] = t;
temper[0] = 2 * MAX - 2 - c + 1; //temper[0]记录所得的积最高位的确切位置,
//此时为有进位的情况
}
else
temper[0] = 2 * MAX -2 - c;
}
void Add(int result[],int temper[])
{
static int pos = 2 * MAX - 2; //pos用来定位位置,用静态变量,别有一番用意
int c = pos,t = 0;
for(int i = 2 * MAX - 2; i > 2 * MAX - 2 - temper[0]; i--)
{
if (result[c] == -1)
result[c] = 0;
int tempernumber = result[c] + temper[i];
result[c--] = (tempernumber + t) % 10;
t = (int)(tempernumber / 10);
}
if (t == 1)
result[c] = 1;
pos--;
}
void printresult(int result[])
{
for(int i = 1; i < 2 * MAX - 1 ; i++)
if (result[i] != -1)
printf("%d",result[i]);
}