一、简介
众所周知,C语言中INT类型是有限制,不能进行超过其范围的运算,而如果采用float类型进行运算,由于float在内存中特殊的存储形式,又失去了计算的进度。要解决整个问题,一种解决方法是通过字符串数组实现数据的存储,然后实现它们之间四则运算的函数。
二、数据结构
为了实现字符数组之间的运算,要考虑数值的正负性,数字的长度以及具体存储的数字
typedef struct num{ int len; //数值长度 char symbol; //数字正负形 int number[LEN]; //数组 }NUM,*SNUM;
三、函数
整个程序使用了一下的函数
SNUM expToNum(char exp[]);//将输入字符串转换为对应结构体 void reverse(int a[],int len);//数组逆序 int compareAbs(SNUM left,SNUM right);//比较两数绝对值大小 SNUM anti_add(SNUM left,SNUM right);//元加法 SNUM anti_sub(SNUM left,SNUM right);//元减法 SNUM add(SNUM left,SNUM right); //加法 SNUM sub(SNUM left,SNUM right); //减法 SNUM multiply(SNUM left,SNUM right); //乘法 SNUM divide(SNUM left,SNUM right); //除法 SNUM mod(SNUM left,SNUM right);//求摸运算
函数的定义
1 SNUM multiply(SNUM left,SNUM right){ 2 //left作为被乘数,right作为乘数 3 SNUM mul = (struct num*)malloc(sizeof(struct num)); 4 int i,j; 5 for(i=0;i<LEN;i++){ 6 mul->number[i]=0; 7 } 8 9 if(left->symbol==right->symbol){ 10 mul->symbol='+'; 11 }else{ 12 mul->symbol='-'; 13 } 14 15 16 17 for(i=0;i<right->len;i++){ 18 for(j=0;j<left->len;j++){ 19 mul->number[i+j]+=left->number[j]*right->number[i]; 20 } 21 } 22 23 24 25 // //进位化简 26 int len = left->len+right->len-1; //长度 27 28 // 29 for(i=0;i<len;i++){ 30 mul->number[i+1]+=mul->number[i]/10; 31 mul->number[i]%=10; 32 33 if(i==len-1){ 34 if(mul->number[i+1]!=0){ //还存在高位 35 len++; 36 }else{ //进位完毕,退出 37 break; 38 } 39 } 40 } 41 42 43 44 // //舍去多余0位 45 for(i=len-1;i>=0;i--){ 46 if(mul->number[i]==0){ 47 len--; 48 }else{ 49 break; 50 } 51 } 52 if(len==0){ 53 len=1; 54 } 55 56 mul->len=len; 57 58 free(left); 59 free(right); 60 return mul; 61 } 62 63 64 65 //减一个数等于加上一个数的相反数 66 SNUM sub(SNUM left,SNUM right){ 67 right->symbol=(right->symbol=='+'?'-':'+'); 68 return add(left,right); 69 } 70 71 //比较两数绝对值大小 72 int compareAbs(SNUM left,SNUM right){ 73 if(left->len>right->len){ //left的位数更多 74 return 1; 75 }else if(left->len<right->len){ //right的位数更多 76 return -1; 77 }else{ 78 int i=left->len-1; 79 while(i>=0){ //从高位开始比较 80 if(left->number[i]>right->number[i]){ 81 return 1; 82 } 83 if(left->number[i]<right->number[i]){ 84 return -1; 85 } 86 i--; 87 } 88 return 0; //两者绝对值相等 89 } 90 } 91 92 93 SNUM expToNum(char exp[]){ 94 95 SNUM temp=(struct num*)malloc(sizeof(struct num)); 96 97 int locan=0; 98 //确定正负号 99 if(exp[0]=='+'||exp[0]=='-'){ 100 temp->symbol=exp[0]; 101 locan++; 102 }else{ 103 temp->symbol='+'; 104 } 105 106 //输入到数组 107 int count=0; 108 while(exp[locan]!='