功能:简单的加减乘除运算 特色:超大数运算。 //程序只写了一部分,还有其它功能没写完 下面只是部分代码 只是传统减法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; } |
|
来自: 菌心说 > 《编程+、计算机、信息技术》