4 条题解
-
-1
/*#include <iostream> using namespace std; const int Maxn=10; int a[Maxn],b[Maxn],c[2*Maxn]; int lena, lenb, lenc, t; int main() { string s1,s2; cin>>s1>>s2; //s1,s2为十进制字符串值,如:s1=(190)D, s2=(80)D lena=s1.length()-1; lenb=s2.length()-1; //lena: 数据a的最高权位,对应数值a实际存储下标:[0..lena] lenc=lena+lenb+1; //lenc: 相乘后的结果c[]位数是: lena+lenb+1, 也可能是: lena+lenb for(int i=0; i<=lena; i++){ //1. 将s1字符串转存入数组a[]中, 考虑到高位可以拓展, 因此最低位放在0位置 if('0'<=s1[i] and s1[i]<='9') t=s1[i]-48; else t=s1[i]-'A'+10; a[lena-i]=t; } for(int i=0; i<=lenb; i++){ if('0'<=s2[i] and s2[i]<='9') t=s2[i]-48; else t=s2[i]-'A'+10; b[lenb-i]=t; } for(int i=0; i<=lena; i++){ //2. 数据a与数据b按对应位置相乘, 权位i与权位j相乘, 其结果累加到数组c[i+j](权位:i+j)中 for(int j=0; j<=lenb; j++){ c[i+j]=c[i+j]+a[i]*b[j]; } } for(int i=0; i<=lenc; i++){ //3. 将相乘后的结果进行整理,整理成10进制 c[i+1]+=c[i]/10; c[i]%=10; } while(c[lenc]==0 && lenc>0) lenc--; // 最高位lenc值可能存在多个0, 将高位无效的0进行消除,(但要确保至少留下1位, 比如:乘以0) for(int i=lenc; i>=0; i--){ //4. 从高位到低位, 依次输出高精度数据c[lenc..0] printf("%d",c[i]); } return 0; }*/ //高精度乘法; /*#include <iostream> using namespace std; const int Maxn=10; int a[Maxn],b[Maxn],c[Maxn]; int lena, lenb, lenc, t; int main() { string s1,s2; cin>>s1>>s2; //s1,s2为十六进制字符串值,如:s1=(B90)H, s2=(80)H if(s1.length()<s2.length() or(s1.length()==s2.length() && s1<s2)){ //若s1数据小于s2数据, 则输出"-", 同时进行交换,s1与s2比较最高位字母或数字先后顺序,比较大小; cout<<"-"; swap(s1,s2); } lena=s1.length()-1; lenb=s2.length()-1; //lena: 数据a的最高权位,对应数值a实际存储下标:[0..lena] lenc=lena; //lenc: 数据a大于数据b, a-b, 结果c最大可能权位<=lena for(int i=0; i<=lena; i++){ //1. 将s1字符串转存入数组a[]中, 考虑到高位可以拓展, 因此最低位放在0位置 if('0'<=s1[i] and s1[i]<='9') t=s1[i]-48; else t=s1[i]-'A'+10; a[lena-i]=t; } for(int i=0; i<=lenb; i++){ if('0'<=s2[i] and s2[i]<='9') t=s2[i]-48; else t=s2[i]-'A'+10; b[lenb-i]=t; } for(int i=0; i<=lenc; i++){ //2. 将数据a与数据b按对应位置相减 c[i]=a[i]-b[i]; } for(int i=0; i<=lenc; i++){ //3. 将各个位置数据, 从低位到高位, 依次整理成16进制数值(0..15) if(c[i]<0){c[i]+=16; c[i+1]--;} // 整理负数 } while(c[lenc]==0 && lenc>0) lenc--; // 最高位lenc值可能存储多个0, 将高位无效的0进行消除,(但要确保至少留下1位) for(int i=lenc; i>=0; i--){ //4. 从高位到低位, 依次输出高精度数据c[lenc..0] if(c[i]>=10){printf("%c",c[i]+55);} else{printf("%d",c[i]);} } return 0; }*/ //高精度减法; #include <iostream> using namespace std; const int Maxn=100; int a[Maxn],b[Maxn],c[Maxn]; int lena, lenb, lenc, t; int main() { string s1,s2; cin>>s1>>s2; //s1,s2为十六进制字符串值,如:s1=(B90)H, s2=(80)H lena=s1.length()-1; lenb=s2.length()-1; //lena: 数据a的最高权位,对应数值a实际存储下标:[0..lena] lenc=max(lena, lenb)+1; //lenc: 数据a+b, 产生结果c的最大可能权位,实际也可能是lenc-1 for(int i=0; i<=lena; i++){ //1. 将s1字符串转存入数组a[]中, 考虑到高位可以拓展, 因此最低位放在0位置 if('0'<=s1[i] and s1[i]<='9') t=s1[i]-48; else t=s1[i]-'A'+10; a[lena-i]=t; } for(int i=0; i<=lenb; i++){ if('0'<=s2[i] and s2[i]<='9') t=s2[i]-48; else t=s2[i]-'A'+10; b[lenb-i]=t; } for(int i=0; i<=lenc; i++){ //2. 将数据a与数据b按对应位置相加 c[i]=a[i]+b[i]; } for(int i=0; i<=lenc; i++){ //3. 将各个位置数据, 从低位到高位, 依次整理成16进制数值(0..15) c[i+1]+=c[i]/16; c[i]%=16; } if(c[lenc]==0) lenc--; // 最高位lenc值为0, 则不存在,进行退位 for(int i=lenc; i>=0; i--){ //4. 从高位到低位, 依次输出高精度数据c[lenc..0] if(c[i]>=10){printf("%c",c[i]+55);} else{printf("%d",c[i]);} } return 0; }
信息
- ID
- 98
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 354
- 已通过
- 84
- 上传者