本文主要是介绍高精度计算----减法运算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
处理大数减法运算:1、首先要判断被减数与减数哪个更大,再相应的带入减法函数去处理。具体的比较可以使用字符串的相关知识去比较。
2、相减要先对齐数组,依照减数的长度,执行相应的减法运算次数。
3、不需要借位相减的话,直接减去;需要的话,向前借一位,若前一位是0,则再前借(此时前一位的0变为10)。
测试程序效果如下:
以下代码包括相减函数,比较被减数减数函数,若有错误,请指出:
- #include "stdio.h"
- #include "string.h"
- /************************************************************************/
- /* 高精度减法 (这个函数要a[]>=b[]) */
- /* a[]被减数数组,位数不限 */
- /* b[]减数数组,位数不限 */
- /* back[]结果数组,位数不会大于a[]数组的 */
- /************************************************************************/
- void sub(char a[],char b[],char back[])
- {
- int i,k,l1,l2;
- l1=strlen(a);
- l2=strlen(b);
- back[l1]='/0';
- for (i=l2-1,l1--;i>=0;l1--,i--) //减数的个数小于等于被减数,所以减的次数依减数而定
- {
- if (a[l1]-b[i]>=0) //不需要借位相减
- {
- back[l1]=a[l1]-b[i]+'0';
- }
- else //向前一位借1
- {
- back[l1]=10+a[l1]-b[i]+'0';
- if (a[l1-1]!='0') //当前一位非0,可以被借时,直接借来
- {
- a[l1-1]-=1;
- }
- else //若前一位为0,则无法借到,继续向前一位的前一位借,循环
- {
- k=l1-1;
- while (a[k]=='0')
- {
- a[k]='9'; //前一位的0,就变成了10,扣去被后一位借去的,还有9
- k--;
- }
- a[k]-=1; //到达可以借的位置
- }
- }
- }
- while (l1>=0) //被减数多于减数的位数直接赋给结果数组
- {
- back[l1]=a[l1];
- l1--;
- }
- while (back[0]=='0') //将结果数组往前移,方便以后的操作
- {
- l1=strlen(a);
- for (i=0;i<l1-1;i++)
- {
- back[i]=back[i+1];
- }
- back[l1-1]='/0';
- }
- if (strlen(back)==0) //被减数与减数刚好相减为0的情况
- {
- back[0]='0';
- back[1]='/0';
- }
- }
- /************************************************************************/
- /* 判断函数(被减数与减数的大小比较) */
- /* 可以用strcmp函数比较字符串 */
- /* 比较完后,若小于减数,则置换带入高精度减法函数,最后加'-'输出 */
- /************************************************************************/
- bool isBigger(char a[],char b[])
- {
- int l1,l2;
- l1=strlen(a);
- l2=strlen(b);
- if (l1>l2)
- {
- return true;
- }
- else if (l1<l2)
- {
- return false;
- }
- else
- {
- if (strcmp(a,b)>=0)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- }
- /************************************************************************/
- /* 主函数调用 */
- /************************************************************************/
- int main()
- {
- int n;
- char a[1000],b[1000],c[1000];
- printf("%s","计算次数: ");
- scanf("%d",&n);
- while (n--)
- {
- memset(a,'/0',sizeof(a));
- memset(b,'/0',sizeof(b));
- memset(c,'/0',sizeof(c));
- printf("%s","被减数: ");
- scanf("%s",&a);
- printf("%s","减数: ");
- scanf("%s",&b);
- if (isBigger(a,b))
- {
- sub(a,b,c);
- printf("%s%s/n/n","结果为: ",c);
- }
- else
- {
- sub(b,a,c);
- printf("%s%c%s/n/n","结果为: ",'-',c);
- }
- }
- return 0;
- }
这篇关于高精度计算----减法运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!