标签:color 倒序 比较大小 efi 个数 ++ else 移位操作 AC
之前写的,写的不是很好……
放在这相当于一个备份……
欢迎提意见!
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;负 -1 12 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;相等 0 22 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 }
标签:color 倒序 比较大小 efi 个数 ++ else 移位操作 AC
原文地址:https://www.cnblogs.com/rq1b-qsy666/p/9071457.html