大数加减乘模板
Posted kongbursi-2292702937
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数加减乘模板相关的知识,希望对你有一定的参考价值。
大数加法:
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 #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
以上是关于大数加减乘模板的主要内容,如果未能解决你的问题,请参考以下文章