最近,学习了一些高精度的算法,展示出来,这只是其中的加法,其他的同理
只学习了c语言,暂时还不会其他语言。
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define N 20
void Getnumber(char s[]);
void beep();
void Addnumber(char a[], char b[], char c[]);
char Addchar(char ch1, char ch2);
void Leftrim(char str[]);
int tag = 0;
int main()
{
char a[N + 1] = { 0 }, b[N + 1] = { 0 }, c[N + 2];
printf("a=");
while (strlen(a) == 0) //检查字符串是否为空
Getnumber(a);
printf("\nb=");
while (strlen(b) == 0)
Getnumber(b);
Addnumber(a, b, c); //三个字符串数组实现模拟加法
printf("\na+b=%s\n", c);
return 0;
}
void Getnumber(char s[])
{
int i = 0;
char ch;
while (1)
{
ch = _getch();
if (ch == '\r') //输入回车
break;
if (ch == '\b') //输入退格
{
if (i > 0)
{
//‘\b’的作用是光标退格,这个语句是光标先退格,然后空格覆盖输出的数字
printf("%c %c", ch, ch);
i--; //数组下标-1
}
else
beep(); //响铃,警报
continue;
}
if (ch < '0' || ch>'9')
{
beep();
continue;
}
if (i < N)
{
printf("%c", ch);
s[i++] = ch;
}
else
beep();
}
s[i] = '\0';
}
void Addnumber(char a[], char b[], char c[])
{
int i, j, k;
memset(c, ' ', N + 2); //清空c
i = strlen(a) - 1; //strlen不测量/0的长度,但是因为后面要对数组的下标0访问,更方便
j = strlen(b) - 1;
k = N; //N是常量,用变量代替
while (i >= 0 && j >= 0) //对齐的位数相加
c[k--] = Addchar(a[i--], b[j--]);
while (i >= 0) //多出来的位数相加
c[k--] = Addchar(a[i--], '0');
while (j >= 0)
c[k--] = Addchar(b[j--], '0');
if (tag == 1)
c[k] = '1';
c[N + 1] = '\0';
Leftrim(c);
}
void beep()
{
printf("\07");
}
char Addchar(char ch1, char ch2)
{
char ch;
ch = (ch1 - '0' + ch2 - '0') + tag; //转化为ascll码值为0-9的值,然后加减
if (ch >= 10)
{
tag = 1; //标记位
return (ch - 10 + 0x30);
}
else
{
tag = 0;
return (ch + '0');
}
}
void Leftrim(char str[]) //作用是将打印在数组后面的字符串,移到小标为0的地方
{
int i;
for (i = 0; str[i] == ' '; i++);
strcpy(str, str + i);
}