简易计算器(C语言版)
功能:简单的加减乘除运算
特色:超大数运算。
//程序只写了一部分,还有其它功能没写完
下面只是部分代码
只是传统减法C语言算法
若有不足多谢指点
创作不易复制请注明出处
//减法算法
int mysub1(char *s1, char *s2, int s1len, int s2len)
{
int abc = 1;//用于判断结果正负 负数abc赋值为-1
if (s1len < 0 || s2len < 0)return -1;
int len1 = 0, len2 = 0;//对拷s1和s2并转换成数字后补齐位数后的长度,若是小数其实len1和len2的长度是一样的
int count1 = 0, count11 = 0;//分别是第一个数的小数部分长度 和 整数部分长度
int F1 = 0; //用于判断是否是小数,是小数F1=1,否则F1=0
for (int i = 0; i < s1len; i++)
{
if (*(s1 + i) == '.') { F1 = 1; break; }
}
//若是小数则 计算小数部分长度
for (int i = s1len - 1; i >= 0 && (F1 == 1); i--)
{
if (*(s1 + i) != '.')
count1++;
else
break;
}
//计算第一个加数的整数部分长度
count11 = (F1 == 1) ? (s1len - 1 - count1) : s1len;
//相同方法处理第二个加数
int count2 = 0, count22 = 0;
int F2 = 0;
for (int i = 0; i < s2len; i++)
{
if (*(s2 + i) == '.') { F2 = 1; break; }
}
for (int i = s2len - 1; i >= 0 && (F2 == 1); i--)
{
if (*(s2 + i) != '.')
count2++;
else
break;
}
count22 = (F2 == 1) ? (s2len - 1 - count2) : s2len;
len1 = (count1 > count2) ? count1 : count2;
int cc = len1;//用于后面标记小数的位置,这几行语句顺序不能颠倒
len1 += (count11 > count22) ? count11 : count22;
len2 = len1;
//为两个加数定义为a和b并为其动态分配内存空间
int* a = (int*)malloc(sizeof(int)*len1);
int* b = (int*)malloc(sizeof(int)*len2);
if (!a || !b)return -2;
//初始化a和b len1和len2其实是一样大的
for (int i = 0; i < len1; i++)
{
*(a + i) = 0;
*(b + i) = 0;
}
//定义结果变量c 以及取得长度
int len = len1 ;
int* c= (int*)malloc(sizeof(int)*len);
if (!c)return -3;
//初始化和变量
for (int i = 0; i < len; i++)*(c + i) = 0;
int tt1 = count1 - count2;//用计算补齐几个0用
for (int i = s1len - 1, j = len1 - 1; j >= 0; i--, j--)
{
if (tt1 < 0)
{
while (tt1)
{
*(a + j--) = 0; tt1++;
}
}
if (*(s1 + i) == '.')i--;
if (i >= 0)
*(a + j) = *(s1 + i) - '0';
else
*(a + j) = 0;
}
int tt2 = count2 - count1;//用计算补齐几个0用
for (int i = s2len - 1, j = len2 - 1; j >= 0; i--, j--)
{
if (tt2 < 0)
{
while (tt2)
{
*(b + j--) = 0;
tt2++;
}
}
if (*(s2 + i) == '.')i--;
if (i >= 0)
*(b + j) = *(s2 + i) - '0';
else
*(b + j) = 0;
}
//-------------------
//判断a与b的大小,大数作为第一个数
int a1 = 0, b1 = 0;//用于判断a和b哪个大大的就赋值为1
for (int i = 0; i < len1; i++)
{
int tmp=*(a + i) - *(b + i);
if (tmp > 0)
{
a1 = 1; break;
}
else if (tmp < 0)
{
b1 = 1;
abc = -1;
break;
}
//如果循环结束a1==0 && b1==0表示a和b相等 结果直接为0即可
}
//a>=b时情况
int cou = 0;
if((a1 == 1) || (a1 == 0 && b1 == 0))
for (int i = len - 1, j = len1 - 1, k = len2 - 1; i >= 0; i--, j--, k--)
{
int vv = 0; //是否借位的记号 借位赋值1
int n = 0;//借位移动了几位
cou++;
int tmp1= *(a + j) - *(b + k);
if (cou <= len1 )
{
if(tmp1>=0)
{
*(c + i) = tmp1;
}
else//向高位(低索引处借位)
{
tmp1 += 10;
*(c + i) = tmp1;
vv = 1;
}
}
else *(c + i) = 0;
//处理借位
if (vv == 1)
for (int ccc = j-1;ccc >= 0 && j>0;ccc--)
{
if (*(a + ccc) == 0)n++;
else
break;
}
if (vv == 1)
/*
for (int iii = j - 1,bb=n; iii >= 0 && j > 0 && bb>0; iii--,bb--)
{
*(a+iii - bb+1) += 9;
}
*/
for (int bb = n; bb<j && bb>0; bb--)
{
*(a +j-bb) += 9;
}
//借位处减去1
if (vv == 1 && j >= (n + 1))
*(a + (j - n - 1)) -= 1;
//重置
vv = 0;
n = 0;
}
//a<b情况
int cou2 = 0;
if ((b1 == 1))
for (int i = len - 1, j = len1 - 1, k = len2 - 1; i >= 0; i--, j--, k--)
{
int vv = 0; //是否借位的记号 借位赋值1
int n = 0;//借位移动了几位
cou2++;
int tmp1 = *(b + k)-*(a + j) ;
if (cou2 <= len2)
{
if (tmp1 >= 0)
{
*(c + i) = tmp1;
}
else//向高位(低索引处借位)
{
tmp1 += 10;
*(c + i) = tmp1;
vv = 1;
}
}
else *(c + i) = 0;
//处理借位
if(vv==1)
for (int ccc = j - 1; ccc >= 0 && j>0; ccc--)
{
if (*(b+ ccc) == 0)n++;
else
break;
}
if (vv == 1)
for (int bb = n; bb<k && bb>0; bb--)
{
*(b +k - bb ) += 9;
}
//借位处减去1
if (vv == 1 && k>=(n+1) )
*(b + (k - n - 1)) -= 1;
//重置
vv = 0;
n = 0;
}
//输出
for (int i = 0; i < len; i++)
{
if(abc==-1)
{
printf('-');
abc == 1;
}
if ((F1 || F2) && (i == (len - cc)))printf('.');
printf('%d', *(c + i));
}
printf('\n');
/*
int jj = 0;
char ss[5] = { '\0' };
for (int i = 0; i < len && jj<10001; i++, jj++)
{
ss[0] = '\0';
//若是负数符号插入到最前面
if (abc == -1)
{
sprintf_s(&ss[0], 4, '%c','-');
str4[0] = ss[0];
jj++;
abc = 1;
}
if ((F1 || F2) && (i == len - cc))
{
sprintf_s(&ss[0], 4, '%c', '.');
str4[jj++] = ss[0];
}
sprintf_s(&ss[0], 4, '%d', *(c + i));
str4[jj] = ss[0];
}
str4[jj] = '\0';
printf('\n');
*/
//释放
free(a);
free(b);
free(c);
return 0;
}