模拟,大数乘法,大数减法 #include <iostream> #include <cstring> using namespace std; void mult(char a[],char b[],char s[]) { int i,j,k=0,alen,blen,sum=0,res[300][300]={0},flag=0; char result[300]; alen=strlen(a);blen=strlen(b); for (i=0;i<alen;i++) for (j=0;j<blen;j++) res[i][j]=(a[i]-'0')*(b[j]-'0'); for (i=alen-1;i>=0;i--) { for (j=blen-1;j>=0;j--) sum=sum+res[i+blen-j-1][j]; result[k]=sum%10; k=k+1; sum=sum/10; } for (i=blen-2;i>=0;i--) { for (j=0;j<=i;j++) sum=sum+res[i-j][j]; result[k]=sum%10; k=k+1; sum=sum/10; } if (sum!=0) {result[k]=sum;k=k+1;} for (i=0;i<k;i++) result[i]+='0'; for (i=k-1;i>=0;i--) s[i]=result[k-1-i]; s[k]='/0'; while(1) { if (strlen(s)!=strlen(a)&&s[0]=='0') strcpy(s,s+1); else break; } } void sub(char str1[],char str2[],char str3[]) { int i, j, i1, i2, tmp, carry; int len1 = strlen(str1), len2 = strlen(str2); char ch; i1 = len1-1; i2 = len2-1; j = carry = 0; while(i2 >= 0) { tmp = str1[i1] - str2[i2] - carry; if(tmp < 0) { str3[j] = tmp+10+'0'; carry = 1; } else { str3[j] = tmp+'0'; carry = 0; } --i1; --i2; ++j; } while(i1 >= 0) { tmp = str1[i1] - '0' - carry; if(tmp < 0) { str3[j] = tmp+10+'0'; carry = 1; } else { str3[j] = tmp + '0'; carry = 0; } --i1; ++j; } --j; while(str3[j] == '0' && j > 0) --j; str3[++j] = '/0'; for(i = 0, --j; i < j; ++i, --j) { ch = str3[i]; str3[i] = str3[j]; str3[j] = ch; } } bool isLarge(char a[], char b[]) { int sa = strlen(a); int sb = strlen(b); if(sa > sb) return true; if(sa < sb) return false; for(int i = 0; i < sa; i++) { if(a[i] < b[i]) return false; if(a[i] > b[i]) return true; } return true; } void intToChar(int x, char a[]) { char temp[100]; int t = 0; while(x != 0) { temp[t++] = (char)(x % 10 + '0'); x /= 10; } a[t] = '/0'; for(int i = 0; i < t; i++) { a[i] = temp[t-i-1]; } } int main() { char resa[300], resb[300]; char res[300]; char aa[300], bb[300]; int a, b; cin >> a >> b; resa[0] = '1'; resa[1] = '/0'; resb[0] = '1'; resb[1] = '/0'; intToChar(a, aa); intToChar(b, bb); for(int i = 1; i <= b; i++) mult(aa, resa, resa); for(int i = 1; i <= a; i++) mult(bb, resb, resb); if(isLarge(resa, resb)) { sub(resa, resb, res); cout << res << endl; } else { sub(resb, resa, res); cout << '-' << res << endl; } return 0; }