简易计算器(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;

}

(0)

相关推荐