大整數加減乘除 - 初代
阿新 • • 發佈:2018-05-22
arr 加減乘除 一位 get || 防止 大整數 移位 return
之前寫的,寫的不是很好……
放在這相當於一個備份……
歡迎提意見!
1 #include<iostream> 2 #include<string> 3 #include<cmath> 4 #define N 500 5 using namespace std; 6 7 class num 8 { 9 private: 10 int number[N]; 11 int sign; //判斷正負:正 1;負 -112 public: 13 num(int t=0); //構造 t 14 num(num &n); //復制構造函數 15 num(num &a,char symbol,num &b); //重載構造函數(計算中樞) 16 int leng(); //計算位數 17 void get(); 18 void put(); 19 void copy(num &n); //復制 20 void move(int t); //移位(*10^t) 21 int compare(num &n); //絕對值比較大小:大 1;小 -1;相等 022 void carry(); //處理進位 23 void add(num &n); //n1 + n2 24 void multiply(num &n); //n1 * n2 25 void subtract(num &n); //n1 - n2 26 void divide(num &n); //n1 / n2 27 }; 28 int main() 29 { 30 while(true) 31 { 32 num a,b; 33 a.get(); 34 b.get(); 35 a.divide(b); 36 a.put(); 37 num c(a,‘*‘,b); 38 c.put(); 39 a.put(); 40 cout<<endl; 41 } 42 return 0; 43 } 44 45 num::num(int t) 46 { 47 for(int i=0;i<N;++i) 48 number[i]=0; 49 sign=1; //至此,初始化為 0 50 number[0]=t; //將第一位賦值,然後進行進位處理 51 carry(); 52 } 53 54 num::num(num &n) 55 { 56 copy(n); 57 } 58 59 num::num(num &a,char symbol,num &b) 60 { 61 copy(a); 62 if(symbol == ‘+‘) 63 add(b); 64 else if(symbol == ‘-‘) 65 subtract(b); 66 else if(symbol == ‘*‘) 67 multiply(b); 68 else if(symbol == ‘/‘) 69 divide(b); 70 } 71 72 int num::leng() 73 { 74 int length=0; 75 bool flag=false; //判斷位數,逆向循環,未到最大位時一直為 false 76 for(int i=N-1;i>=0;--i) 77 { 78 if(number[i] != 0) 79 flag=true; 80 if(flag) 81 length += 1; 82 } 83 return length; 84 } 85 86 void num::get() 87 { 88 char Num[N]; 89 cout<<"請輸入一個整數:"; 90 int i; 91 for(i=0;i<N;++i) 92 { 93 Num[i]=getchar(); 94 if(Num[i] == ‘\n‘) 95 { 96 --i; 97 break; 98 } //一行輸入一個數 99 if(Num[i] == ‘-‘ && i == 0) 100 { 101 sign=-1; 102 --i; //判斷正負 103 } 104 } 105 for(int j=0;j<=i;j++) 106 { 107 number[j]=Num[i-j]-‘0‘; 108 if(number[j] < 0 || number[j] > 9) 109 { 110 cout<<"輸入錯誤!"; 111 exit(0); 112 } 113 } //倒序,轉化為整形數組,並判斷其合法性 114 } 115 116 void num::put() 117 { 118 bool flag=false; //判斷位數,逆向循環,未到最大位時一直為 false 119 num n0(0); 120 cout<<"結果為:"; 121 if(sign == -1 && compare(n0) != 0) 122 cout<<"-"; //輸出符號 123 for(int i=N-1;i>=0;--i) 124 { 125 if(number[i] != 0) 126 flag=true; 127 if(flag) 128 cout<<number[i]; 129 } //倒序輸出 130 if(!flag) 131 cout<<"0"; //防止空輸出 132 cout<<endl; 133 } 134 135 void num::copy(num &n) 136 { 137 for(int i=0;i<N;++i) 138 number[i]=n.number[i]; //逐項復制 139 sign=n.sign; 140 } 141 142 void num::move(int t) 143 { 144 if(t > 0) 145 { 146 for(int i=N-1;i>=0;--i) 147 { 148 if(i < t) 149 number[i]=0; //數字末尾(數組開頭)加 0 150 else 151 number[i]=number[i-t]; 152 } 153 } //右移 154 else if(t < 0) 155 { 156 for(int i=0;i<N;++i) 157 { 158 if(i >= N+t) 159 number[i]=0; //去除多余位上的 0 160 else 161 number[i]=number[i-t]; 162 } 163 } //左移 164 } 165 166 void num::carry() 167 { 168 for(int i=0;i<N-1;++i) 169 { 170 while(number[i] < 0) 171 { 172 --number[i+1]; 173 number[i] +=10; 174 } //借位 175 while(number[i] > 9) 176 { 177 ++number[i+1]; 178 number[i] -=10; 179 } //進位 180 } 181 } 182 183 int num::compare(num &n) 184 { 185 for(int i=N-1;i>=0;--i) 186 { 187 if(number[i] > n.number[i]) 188 return 1; 189 else if(number[i] < n.number[i]) 190 return -1; 191 } //逐項比較 192 return 0; 193 } 194 195 void num::add(num &n) 196 { 197 if((sign * n.sign) == 1) 198 for(int i=0;i<N;++i) 199 number[i] += n.number[i]; //加法 200 else 201 { 202 bool flag; //判斷是否為小數減大數 203 if(compare(n) >= 0) 204 flag=true; 205 else 206 flag=false; 207 for(int i=0;i<N;++i) 208 { 209 if(flag) 210 number[i] -= n.number[i]; 211 else 212 number[i] = n.number[i]-number[i]; 213 } //始終保持大數減小數(如果是小數減大數,結果取相反數) 214 if(!flag) 215 sign *=-1; 216 } //減法 217 carry(); 218 } 219 220 void num::multiply(num &n) 221 { 222 int x[N]={0}; //儲存結果(方法1) 223 for(int i=0;i<N;++i) 224 for(int j=0;j<N;++j) 225 x[i+j] += number[i]*n.number[j]; //各項相乘 226 for(int i=0;i<N;++i) 227 number[i]=x[i]; //逐項復制 228 sign *= n.sign; 229 carry(); 230 } 231 232 void num::subtract(num &n) 233 { 234 num nn(n); 235 nn.sign *= -1; //轉化為加法 236 add(nn); 237 } 238 239 void num::divide(num &n) 240 { 241 num x; //儲存結果(方法2) 242 x.sign=sign * n.sign; 243 sign=1; 244 n.sign=1; //處理符號 245 int length1=leng(),length2=n.leng(); 246 if(length2 == 0) 247 { 248 cout<<"無法計算"<<endl; 249 exit(0); 250 } //防止分母為 0 251 for(int t=length1-length2;t>=0;--t) 252 { 253 num nn(n); 254 nn.move(t); //為減少循環次數,采用移位操作。 255 while(compare(nn) >= 0) 256 { 257 subtract(nn); 258 ++x.number[t]; 259 } 260 } //計算分子最多能減多少次分母 261 x.carry(); 262 copy(x); 263 }
大整數加減乘除 - 初代