1 #include<stdio.h> 2 #include<string> 3 using namespace std; 4 5 const int N=30; 6 int min(int n,int m)//返回两个数中的最小一个数 7 { 8 return (n<m) ? n : m; 9 } 10 11 int max(int n,int m)//返回两个数中的最大一个数 12 { 13 return (n>m) ? n : m; 14 } 15 16 void Add()//两个长整数相加 17 { 18 int i,carry; 19 char num1[N],char num2[N];//数字1,数字2 20 int strlen_num1,strlen_num2;//数字1的长度,数字2的长度 21 int Num1[N],Num2[N],Result[N]; 22 int minnum,maxnum;//两个数中长度最大的一个 23 printf(" ---------Add----------\n"); 24 printf("请输入整数1:"); 25 scanf("%s",&num1); 26 printf("请输入整数2:"); 27 scanf("%s",&num2); 28 29 strlen_num1 = strlen(num1);//获得num1的长度 30 strlen_num2 = strlen(num2);//获得num2的长度 31 //printf("%d",strlen_num1); 32 33 for(i=0;i<strlen_num1;i++) 34 { 35 Num1[i] = num1[strlen_num1-1-i] - '0';//字符转化为整数 36 // printf("%d\n",Num1[i]); 37 38 } 39 40 for(i=0;i<strlen_num2;i++) 41 { 42 Num2[i] = num2[strlen_num2-1-i] - '0';//字符转化为整数 43 } 44 45 46 minnum = min(strlen_num1,strlen_num2); 47 maxnum = max(strlen_num1,strlen_num2); 48 49 carry = 0;//进位初始为0 50 for(i=0;i<minnum;i++) 51 { 52 Result[i] = (Num1[i] + Num2[i] + carry) % 10; 53 carry = (Num1[i] + Num2[i] + carry)/10; 54 } 55 56 57 if(strlen_num1>minnum) 58 { 59 for(i=minnum;i<strlen_num1;i++) 60 { 61 Result[i] = (Num1[i]+ carry) % 10; 62 carry = (Num1[i]+ carry)/10; 63 64 } 65 } 66 67 if(strlen_num2>minnum) 68 { 69 for(i=minnum;i<strlen_num2;i++) 70 { 71 Result[i] = (Num2[i]+ carry) % 10; 72 carry = (Num2[i]+ carry)/10; 73 } 74 } 75 76 if(carry>0)//最后一位有进位 77 { 78 Result[maxnum] = 1; 79 maxnum++; 80 } 81 printf("结果:"); 82 printf("%s+%s=",num1,num2); 83 for(i=maxnum-1;i>=0;i--) 84 { 85 printf("%d",Result[i]); 86 } 87 printf("\n\n"); 88 } 89 90 void Sub()//两个长整数相减 91 { 92 int i,j,carry; 93 char num1[N],char num2[N];//数字1,数字2 94 int strlen_num1,strlen_num2;//数字1的长度,数字2的长度 95 int Num1[N],Num2[N],Result[N]; 96 int minnum,maxnum;//两个数中长度最大的一个 97 printf(" ---------Sub----------\n"); 98 printf("请输入整数1:"); 99 scanf("%s",&num1); 100 printf("请输入整数2:"); 101 scanf("%s",&num2); 102 103 strlen_num1 = strlen(num1);//获得num1的长度 104 strlen_num2 = strlen(num2);//获得num2的长度 105 106 for(i=0;i<strlen_num1;i++) 107 { 108 Num1[i] = num1[strlen_num1-1-i] - '0';//字符转化为整数 109 } 110 111 for(i=0;i<strlen_num2;i++) 112 { 113 Num2[i] = num2[strlen_num2-1-i] - '0';//字符转化为整数 114 } 115 116 minnum = min(strlen_num1,strlen_num2); 117 maxnum = max(strlen_num1,strlen_num2); 118 119 if(minnum==strlen_num1)//被减数小 120 { 121 for(i=minnum;i<maxnum;i++)Num1[i] = 0;//补0 122 for(i=0;i<maxnum;i++) 123 { 124 if(Num2[i]<Num1[i])//需要借位 125 { 126 j = i +1; 127 while(j==0) 128 { 129 Num2[j] += 9; 130 j++; 131 } 132 Num2[j]--; 133 Result[i] = Num2[i] + 10 - Num1[i] ; 134 }else Result[i] = Num2[i] - Num1[i] ; 135 //printf("%d %d\n",Result[i],carry); 136 } 137 138 printf("结果:"); 139 printf("%s-%s=",num1,num2); 140 printf("-"); 141 for(i=maxnum-1;i>=0;i--) 142 { 143 if(Result[i]!=0)printf("%d",Result[i]); 144 } 145 printf("\n"); 146 }else{//被减数大 147 for(i=minnum;i<maxnum;i++)Num2[i] = 0;//补0 148 for(i=0;i<maxnum;i++) 149 { 150 if(Num1[i]<Num2[i])//需要借位 151 { 152 j = i +1; 153 while(j==0) 154 { 155 Num1[j] += 9; 156 j++; 157 } 158 Num1[j]--; 159 Result[i] = Num1[i] + 10 - Num2[i] ; 160 }else Result[i] = Num1[i] - Num2[i] ; 161 //printf("%d %d\n",Result[i],carry); 162 } 163 164 printf("结果:"); 165 printf("%s-%s=",num1,num2); 166 for(i=maxnum-1;i>=0;i--) 167 { 168 if(Result[i]!=0)printf("%d",Result[i]); 169 } 170 printf("\n"); 171 } 172 } 173 int main() 174 { 175 int select,con; 176 printf("-----------两个长整数相加减------------\n"); 177 do{ 178 printf(" -----------------------\n"); 179 printf(" |--------1::加法-------|\n"); 180 printf(" |--------0::加法-------|\n"); 181 printf(" -----------------------\n"); 182 printf("你的选择:"); 183 scanf("%d",&select); 184 if(select==1) 185 { 186 Add(); 187 }else { 188 Sub(); 189 } 190 printf(" -----------------------\n"); 191 printf(" |--------1::继续-------|\n"); 192 printf(" |--------0::退出-------|\n"); 193 printf(" -----------------------\n"); 194 printf("你的选择:"); 195 scanf("%d",&con); 196 }while(con==1); 197 return 0; 198 }