//以下是一个未完工的源程序。
//只实现了 初始化,建造,显示,加法,加1操作。
//其余的操作你可以参考以下,自己独立完成。
//建立数据结构,以数组的形式模拟 10进制多位数 的 加 减 乘 除 模 运算
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MAXDIGIT 300 //10进制多位数的最高位数
typedef struct
{
int value[MAXDIGIT+1]; //以数组形式存放每个位数的数值。
//value[0]存放最后1位
//value[1]存放倒数第2位,以此类推。
//value[DIGIT]中存放溢出标志
int digits; //数值的总位数
//如数值为 123456789,则digits=9
//如数值为 12345678901,则digits=12
} BigValueNumber;
void Initial_BVN(BigValueNumber *NewValue)
//初始化
//输出:将10进制多位数的各个数位置为0,
// 溢出标志置为0
// 总位数置为1
{
int i;
for(i=0;i<=MAXDIGIT;i++)
{
NewValue->value[i]=0;
}
NewValue->digits=1;
}
void Construct_BVN(BigValueNumber *NewValue)
//构造新的10进制多位数
//输入:从键盘输入10进制数
//输出:将键盘输入的10进制数存入相应的数位,并修改总位数,溢出标志置0
{
int i,s_Len;
char *s=(char *)malloc(sizeof(MAXDIGIT));
gets(s);
s_Len=strlen(s);
if(s_Len>MAXDIGIT)
{
s_Len=MAXDIGIT;
}
for(i=0;i<s_Len;i++)
{
NewValue->value[s_Len-i-1]=*(s+i)-'0';
}
NewValue->digits=s_Len;
free(s);
/* printf("\n%s\n",s);
printf("s的长度是%d !!!\n",strlen(s));
printf("新串是:\n");
for(i=0;i<MAXDIGIT;i++)
printf("%d",NewValue->value[i]);
printf("\n新数的长度是%d\n",NewValue->digits);
*/
}
void Show_BVN(BigValueNumber *Number)
//数位从高到低向屏幕输出10进制多位数并显示总位数
{
int i;
for(i=MAXDIGIT-1;i>=0;i--)
{
printf("%d",Number->value[i]);
}
printf("\n该数是一个十进制%d位数。\n",Number->digits);
}
void Add_BVN(BigValueNumber *To,BigValueNumber *From,BigValueNumber *Result)
//加法
//输入:两个参与加法运算的10进制多位数,To为加数,From为被加数
//输出: 将最后结果存入 Result
{
int i;
if(From->digits>MAXDIGIT||To->digits>MAXDIGIT)
{
printf("操作数溢出\n");
exit(1);
}
Result->digits=To->digits;
if((From->digits)>(To->digits))
Result->digits=From->digits;
//取出数位较大的数的位数,存入和中
for(i=0;i<Result->digits;i++) //将同位数相加
{
Result->value[i]+=To->value[i]+From->value[i];
if(Result->value[i]>9)
{
Result->value[i]-=10;
Result->value[i+1]++;
}
}
if(Result->value[Result->digits]==1) //出现进位时,将总位数加1
{
Result->digits++;
}
if(Result->value[MAXDIGIT]==1) //总位数超过MAXDIGIT
{
printf("溢出,结果可能不正确\n");
}
}
void Add1_BVN(BigValueNumber *To)
//自身加1
{
int i;
if(To->digits>MAXDIGIT)
{
printf("操作数溢出\n");
exit(1);
}
To->value[0]++; //加1
for(i=0;i<To->digits;i++)
{
if(To->value[i]>9)
{
To->value[i]-=10;
To->value[i+1]++;
}
}
if(To->value[To->digits]==1) //出现进位时,将总位数加1
{
To->digits++;
}
if(To->digits>MAXDIGIT) //总位数超过MAXDIGIT
{
printf("溢出,结果可能不正确\n");
}
}
void Substract_BVN(BigValueNumber *To,BigValueNumber *From)
//减法
{
}
int main(void)
{
BigValueNumber a,b,c;
printf("******************输入被加数***********************\n");
Initial_BVN(&a);
Construct_BVN(&a);
Show_BVN(&a);
printf("******************输入加数*************************\n");
Initial_BVN(&b);
Construct_BVN(&b);
Show_BVN(&b);
printf("******************开始计算*************************\n");
Initial_BVN(&c);
printf("原结果是:\n");
Show_BVN(&c);
Add_BVN(&a,&b,&c);
printf("最后结果是:\n");
Show_BVN(&c);
printf("******************输入要执行+1操作的原数***********\n");
Initial_BVN(&a);
Construct_BVN(&a);
printf("******************开始计算*************************\n");
Add1_BVN(&a);
Show_BVN(&a);
getchar();
getchar();
return 0;
}
[此贴子已经被作者于2007-11-10 23:20:09编辑过]
人生路难走,转眼已白头。伤心望远山,黯然下小楼。