大数加法:
1 #include <stdio.h> 2 3 #include <string.h> 4 5 #define M 100 //定义了数量M是100作为数组初始化的数量 6 7 8 9 int main() 10 11 { 12 13 int i, j, len_s1, len_s2; // len_s1是字符数组s1的长度, len_s2是字符数组s2的长度, 14 15 char s1[M], s2[M]; 16 17 int num1[M] = {0}; // 数字数组num1 18 19 int num2[M] = {0}; // 数字数组num2 20 21 scanf("%s %s", s1, s2); 22 23 len_s1 = strlen(s1); // 求第一个加数的位数 24 25 len_s2 = strlen(s2); // 求第二个加数的位数 26 27 if(len_s1==1 && len_s2==1){ 28 printf("%d ",s1[0]-'0'+s2[0]-'0'); 29 return 0; 30 } 31 32 for(i=len_s1-1, j=0; i>=0; i--) //将字符数组转化为数字数组,并倒数存放,作为第一个加数 33 34 { 35 36 num1[j] = s1[i] - '0'; 37 38 j++; 39 40 } 41 42 for(i=len_s2-1, j=0; i>=0; i--) //将字符数组转化为数字数组,并倒数存放,作为第二个加数 43 44 { 45 46 num2[j] = s2[i] - '0'; 47 48 j++; 49 50 } 51 52 53 54 for(i=0; i<=M; i++) //实现大数的加法 55 56 { 57 58 num1[i] = num1[i]+num2[i]; 59 60 if(num1[i]>9) 61 62 { 63 64 num1[i] = num1[i]-10; 65 66 num1[i+1]++; 67 68 } 69 70 } 71 72 73 74 for(i=M-1; i>=0&&num1[i]==0; i--); //求得最终结果的位数 75 76 77 78 if(i>0) 79 80 { 81 82 for(; i>=0; i--) //最终答案的输出 83 84 { 85 86 printf("%d", num1[i]); 87 88 } 89 90 } 91 92 else 93 94 printf("0"); 95 96 printf(" "); 97 98 return 0; 99 100 } 101 102
大数减法:
1 #include <stdio.h> 2 3 #include <string.h> 4 5 6 7 //设置初始数组个数为100 8 9 #define M 100 10 11 12 13 int main() 14 15 { 16 17 char str_a[M], str_b[M]; // 字符数组的初始化 18 19 int num_a[M] = {0}; // 被减数数组 20 21 int num_b[M] = {0}; // 减数数组 22 23 int num_c[M]; // 差值数组 24 25 int len_a, len_b; // 被减数位数,减数位数 26 27 int i, j, k, n, f=0; 28 29 30 31 scanf("%s %s", str_a, str_b); 32 33 34 35 len_a = strlen(str_a); 36 37 len_b = strlen(str_b); 38 39 40 41 //K的值是参与运算的数据最大位数 42 43 if(len_a>len_b) 44 45 k = len_a; 46 47 else 48 49 k = len_b; 50 51 num_c[0] = 0; 52 53 54 55 //n>0表示a>b, n<0表示a<b, n=0表示a=b 56 57 if(len_a > len_b) 58 59 n = 1; 60 61 else if(len_a == len_b) 62 63 n = strcmp(str_a, str_b); 64 65 else 66 67 n = -1; 68 69 70 71 //字符数组倒序后位数对齐存在整数数组中 72 73 for(i=len_a-1, j=0; i>=0; i--, j++) 74 75 { 76 77 num_a[j] = str_a[i] - '0'; 78 79 } 80 81 for(i=len_b-1, j=0; i>=0; i--, j++) 82 83 { 84 85 num_b[j] = str_b[i] - '0'; 86 87 } 88 89 90 91 //具体执行减法运算 92 93 for(i=0; i<k; i++) 94 95 { 96 97 if(n>=0) 98 99 { 100 101 if(num_a[i]-num_b[i] >= 0) 102 103 num_c[i] = num_a[i] - num_b[i]; 104 105 else 106 107 { 108 109 num_c[i] = num_a[i] + 10 - num_b[i]; 110 111 num_a[i+1]--; 112 113 } 114 115 } 116 117 else 118 119 { 120 121 if(num_b[i]-num_a[i] >= 0) 122 123 num_c[i] = num_b[i] - num_a[i]; 124 125 else 126 127 { 128 129 num_c[i] = num_b[i] + 10 - num_a[i]; 130 131 num_b[i+1]--; 132 133 } 134 135 } 136 137 } 138 139 140 141 //最终结果的输出 142 143 if(n<0) 144 145 printf("-"); 146 147 for(i=k-1; i>=0; i--) 148 149 { 150 151 if(num_c[i]) 152 153 f=1; 154 155 if(f||i==0) 156 157 printf("%d", num_c[i]); 158 159 } 160 161 printf(" "); 162 163 return 0; 164 165 } 166 167
大数乘法:
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 char a[10005],b[10005]; 6 7 int x[10005],y[10005],z[20005]; 8 9 int main() 10 11 { 12 13 int l1,l2,i,j,k; 14 15 while(~scanf(" %s %s",a,b)) 16 17 { 18 19 memset(z,0,sizeof(z)); 20 21 l1=strlen(a),l2=strlen(b); 22 23 for(j=0,i=l1-1;i>=0;i--) 24 25 x[j++]=a[i]-'0'; 26 27 for(j=0,i=l2-1;i>=0;i--) 28 29 y[j++]=b[i]-'0'; 30 31 for(i=0;i<l1;i++) 32 33 for(j=0;j<l2;j++) 34 35 z[i+j]+=x[i]*y[j]; 36 37 for(k=0;k<l1+l2-1;k++) 38 39 if(z[k]>=10) 40 41 { 42 43 z[k+1]+=z[k]/10; 44 45 z[k]%=10; 46 47 } 48 49 for(i=k;i>0;i--) 50 51 { 52 53 if(z[i]==0) 54 55 continue; 56 57 else 58 59 break; 60 61 } 62 63 for(;i>=0;i--) 64 65 printf("%d",z[i]); 66 67 printf(" "); 68 69 } 70 71 return 0; 72 73 }
大数除法(大数除大数):
1 #include<stdio.h> 2 3 #include<string.h> 4 5 char a[100],b[100];//用两个字符串用来输入两个大数 6 7 int x[100],y[100],z[100],m[100];//被除数 除数 商 余数 8 9 int digit;//大数的位数 10 11 void sub(int x[],int y[],int len1,int len2)//大数减法 12 13 { 14 15 int i; 16 17 for(i=0;i<len1;i++) 18 19 { 20 21 if(x[i]<y[i]) 22 23 { 24 25 x[i]=x[i]+10-y[i]; 26 27 x[i+1]--; 28 29 } 30 31 else 32 33 x[i]=x[i]-y[i]; 34 35 } 36 37 for(i=len1-1;i>=0;i--)//判断减法结束之后,被除数的位数 38 39 { 40 41 if(x[i]) 42 43 { 44 45 digit=i+1; 46 47 break; 48 49 } 50 51 } 52 53 } 54 55 int judge(int x[],int y[],int len1,int len2) 56 57 { 58 59 int i; 60 61 if(len1<len2) 62 63 return -1; 64 65 if(len1==len2)//若两个数位数相等 66 67 { 68 69 for(i=len1-1;i>=0;i--) 70 71 { 72 73 if(x[i]==y[i])//对应位的数相等 74 75 continue; 76 77 if(x[i]>y[i])//被除数 大于 除数,返回值为1 78 79 return 1; 80 81 if(x[i]<y[i])//被除数 小于 除数,返回值为-1 82 83 return -1; 84 85 } 86 87 return 0;//被除数 等于 除数,返回值为0 88 89 } 90 91 } 92 93 int main() 94 95 { 96 97 int i,j=0,k=0,temp; 98 99 int len1,len2,len;//len两个大数位数的差值 100 101 while(~scanf("%s %s",a,b)) 102 103 { 104 105 len1=strlen(a);//被除数位数 106 107 len2=strlen(b);//除数位数 108 109 for(i=len1-1,j=0;i>=0;i--)//将字符串中各个元素倒序储存在数组中 110 111 x[j++]=a[i]-'0'; 112 113 for(i=len2-1,k=0;i>=0;i--) 114 115 y[k++]=b[i]-'0'; 116 117 if(len1<len2)//当被除数位数 小于 除数位数时 118 119 { 120 121 printf("商是:0 "); 122 123 printf("余数是:"); 124 125 puts(a); 126 127 } 128 129 else //当被除数位数 大于或者 除数位数时 130 131 { 132 133 len=len1-len2;//两个大数位数的差值 134 135 for(i=len1-1;i>=0;i--)//将除数后补零,使得两个大数位数相同。被除数:4541543329 除数:98745,加零后:9874500000 136 137 { 138 139 if(i>=len) 140 141 y[i]=y[i-len]; 142 143 else 144 145 y[i]=0; 146 147 } 148 149 len2=len1;//将两个大数数位相同 150 151 digit=len1; //将原被除数位数赋值给digit 152 153 for(j=0;j<=len;j++) 154 155 { 156 157 z[len-j]=0; 158 159 while(((temp=judge(x,y,len1,len2))>=0)&&digit>=k)//判断两个数之间的关系以及位数与除数原位数的关系 160 161 { 162 163 sub(x,y,len1,len2); //大数减法函数 164 165 z[len-j]++;//储存商的每一位 166 167 len1=digit;//重新修改被除数的长度 168 169 if(len1<len2&&y[len2-1]==0) 170 171 len2=len1;//将len1长度赋给len2; 172 173 } 174 175 if(temp<0)//若被除数 小于 除数,除数减小一位。例如:被除数:4541543329 除数:(原)98745,(加零后)9874500000,后退一位后:0987450000 176 177 { 178 179 for(i=1;i<len2;i++) 180 181 y[i-1]=y[i]; 182 183 y[i-1]=0; 184 185 if(len1<len2) 186 187 len2--; 188 189 } 190 191 } 192 193 printf("商是:"); 194 195 for(i=len;i>0;i--)//去掉前缀0 196 197 { 198 199 if(z[i]) 200 201 break; 202 203 } 204 205 for(;i>=0;i--) 206 207 printf("%d",z[i]); 208 209 printf(" "); 210 211 printf("余数是:"); 212 213 for(i=len1;i>0;i--) 214 215 { 216 217 if(x[i]) 218 219 break; 220 221 } 222 223 for(;i>=0;i--) 224 225 printf("%d",x[i]); 226 227 printf(" "); 228 229 } 230 231 } 232 233 return 0; 234 235 }
大数加减乘多组输入模板:
1 #include <stdio.h> 2 #include<iostream> 3 #include <string.h> 4 const int M=1e5; //定义了数量M是100作为数组初始化的数量 5 const int N=5e4; //因为我的编译器数组不能开到2e5,乘法的时候要求M<<2,所以开一个M 6 using namespace std; 7 void jia(char s1[M],char s2[M]) 8 9 { 10 //printf("%s**%s ",s1,s2); 11 int i, j, len_s1, len_s2; // len_s1是字符数组s1的长度, len_s2是字符数组s2的长度, 12 13 //char s1[M], s2[M],ch; 14 15 int num1[M] = {0}; // 数字数组num1 16 17 int num2[M] = {0}; // 数字数组num2 18 19 //scanf("%s %c %s", s1,ch,s2); 20 21 len_s1 = strlen(s1); // 求第一个加数的位数 22 23 len_s2 = strlen(s2); // 求第二个加数的位数 24 25 if(len_s1==1 && len_s2==1) 26 { 27 printf("%d ",s1[0]-'0'+s2[0]-'0'); 28 return ; 29 } 30 31 for(i=len_s1-1, j=0; i>=0; i--) //将字符数组转化为数字数组,并倒数存放,作为第一个加数 32 33 { 34 35 num1[j] = s1[i] - '0'; 36 37 j++; 38 39 } 40 41 for(i=len_s2-1, j=0; i>=0; i--) //将字符数组转化为数字数组,并倒数存放,作为第二个加数 42 43 { 44 45 num2[j] = s2[i] - '0'; 46 47 j++; 48 49 } 50 51 52 53 for(i=0; i<=M; i++) //实现大数的加法 54 55 { 56 57 num1[i] = num1[i]+num2[i]; 58 59 if(num1[i]>9) 60 61 { 62 63 num1[i] = num1[i]-10; 64 65 num1[i+1]++; 66 67 } 68 69 } 70 71 72 73 for(i=M-1; i>=0&&num1[i]==0; i--); //求得最终结果的位数 74 75 76 77 if(i>0) 78 79 { 80 81 for(; i>=0; i--) //最终答案的输出 82 83 { 84 85 printf("%d", num1[i]); 86 87 } 88 89 } 90 91 else 92 93 printf("0"); 94 printf(" "); 95 return ; 96 97 } 98 99 100 void jian(char str_a[M],char str_b[M]) 101 102 { 103 104 // 字符数组的初始化 105 106 int num_a[M]; // 被减数数组 107 memset(num_a,0,sizeof(num_a)); 108 int num_b[M]; // 减数数组 109 memset(num_b,0,sizeof(num_b)); 110 int num_c[M]; // 差值数组 111 memset(num_c,0,sizeof(num_c)); 112 int len_a, len_b; // 被减数位数,减数位数 113 114 int i, j, k, n, f=0; 115 116 117 118 //scanf("%s %s", str_a, str_b); 119 120 121 122 len_a = strlen(str_a); 123 124 len_b = strlen(str_b); 125 126 127 128 //K的值是参与运算的数据最大位数 129 130 if(len_a>len_b) 131 132 k = len_a; 133 134 else 135 136 k = len_b; 137 138 num_c[0] = 0; 139 140 141 142 //n>0表示a>b, n<0表示a<b, n=0表示a=b 143 144 if(len_a > len_b) 145 146 n = 1; 147 148 else if(len_a == len_b) 149 150 n = strcmp(str_a, str_b); 151 152 else 153 154 n = -1; 155 156 157 158 //字符数组倒序后位数对齐存在整数数组中 159 160 for(i=len_a-1, j=0; i>=0; i--, j++) 161 162 { 163 164 num_a[j] = str_a[i] - '0'; 165 166 } 167 168 for(i=len_b-1, j=0; i>=0; i--, j++) 169 170 { 171 172 num_b[j] = str_b[i] - '0'; 173 174 } 175 176 177 178 //具体执行减法运算 179 180 for(i=0; i<k; i++) 181 182 { 183 184 if(n>=0) 185 186 { 187 188 if(num_a[i]-num_b[i] >= 0) 189 190 num_c[i] = num_a[i] - num_b[i]; 191 192 else 193 194 { 195 196 num_c[i] = num_a[i] + 10 - num_b[i]; 197 198 num_a[i+1]--; 199 200 } 201 202 } 203 204 else 205 206 { 207 208 if(num_b[i]-num_a[i] >= 0) 209 210 num_c[i] = num_b[i] - num_a[i]; 211 212 else 213 214 { 215 216 num_c[i] = num_b[i] + 10 - num_a[i]; 217 218 num_b[i+1]--; 219 220 } 221 222 } 223 224 } 225 226 227 228 //最终结果的输出 229 230 if(n<0) 231 232 printf("-"); 233 234 for(i=k-1; i>=0; i--) 235 236 { 237 238 if(num_c[i]) 239 240 f=1; 241 242 if(f||i==0) 243 244 printf("%d", num_c[i]); 245 246 } 247 248 printf(" "); 249 250 return ; 251 252 } 253 254 255 void cheng(char a[M],char b[M]) 256 { 257 int x[M],y[M],z[N<<2]; 258 memset(x,0,sizeof(x)); 259 memset(y,0,sizeof(y)); 260 memset(z,0,sizeof(z)); 261 int l1,l2,i,j,k; 262 263 memset(z,0,sizeof(z)); 264 265 l1=strlen(a),l2=strlen(b); 266 267 for(j=0,i=l1-1;i>=0;i--) 268 269 x[j++]=a[i]-'0'; 270 271 for(j=0,i=l2-1;i>=0;i--) 272 273 y[j++]=b[i]-'0'; 274 275 for(i=0;i<l1;i++) 276 277 for(j=0;j<l2;j++) 278 279 z[i+j]+=x[i]*y[j]; 280 281 for(k=0;k<l1+l2-1;k++) 282 283 if(z[k]>=10) 284 285 { 286 287 z[k+1]+=z[k]/10; 288 289 z[k]%=10; 290 291 } 292 293 for(i=k;i>0;i--) 294 295 { 296 297 if(z[i]==0) 298 299 continue; 300 301 else 302 303 break; 304 305 } 306 307 for(;i>=0;i--) 308 309 printf("%d",z[i]); 310 311 printf(" "); 312 313 314 return ; 315 316 } 317 int main() 318 { 319 char ss1[M],ss2[M],ch; 320 while(~scanf("%s %c %s",ss1,&ch,ss2)) 321 { 322 if(ch=='+') 323 { 324 jia(ss1,ss2); 325 } 326 else if(ch=='-') 327 { 328 jian(ss1,ss2); 329 } 330 else if(ch=='*') 331 { 332 cheng(ss1,ss2); 333 } 334 } 335 //printf("%s %c %s",ss1,ch,ss2); 336 return 0; 337 } 338 339 340 341