题目描述
知识点
我的实现
码前思考
- 需要实现很多繁琐的步骤;
- 高精度的加、乘、除都需要;
- 逆转过来记得去处前导0;
代码实现
//需要使用高精度加法,乘法和除法
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e4+10;
struct bign{
int d[maxn];
int len;
bign(){
fill(d,d+maxn,0);
len=0;
}
};
char str[1010];
bign change(char str[]){
int len = strlen(str);
bign a;
for(int i=0;i<len;i++){
a.d[i] = str[len-1-i]-'0';
a.len++;
}
return a;
}
bign divide(bign a,int b,int &r){
bign c;
c.len = a.len;
for(int i=a.len-1;i>=0;i--){
r = r*10+a.d[i];
c.d[i] = r / b;
r = r % b;
}
while(c.len-1>=1&&c.d[c.len-1]==0){
c.len--;
}
return c;
}
bign multi(bign a,int b){
bign c;
int carry=0;
for(int i=0;i<a.len;i++){
int res = a.d[i]*b+carry;
c.d[c.len] = res%10;
c.len++;
carry = res/10;
}
//接下来进行加法运算
while(carry!=0){
c.d[c.len++] = carry%10;
carry /= 10;
}
return c;
}
bign add(bign a,bign b){
bign c;
int carry=0;
for(int i=0;i<a.len||i<b.len;i++){
int res = a.d[i]+b.d[i]+carry;
c.d[c.len++] = res%10;
carry=res/10;
}
if(carry!=0){
c.d[c.len++] = carry;
}
return c;
}
int main(){
//freopen("input.txt","r",stdin);
while(scanf("%s",str)!=EOF){
bign a = change(str);
//接下来是进制转换
bign binary;
do{
int r=0;
a = divide(a,2,r);
binary.d[binary.len] = r;
binary.len++;
}while(!(a.len==1&&a.d[0]==0));
//printf("%d",binary.len);
// for(int i=binary.len-1;i>=0;i--){
// printf("%d",binary.d[i]);
// }
// printf("\n");
//接下来是逆转
reverse(binary.d,binary.d+binary.len);
//去除前导0
while(binary.len-1>=1&&binary.d[binary.len-1]==0){
binary.len--;
}
// for(int i=binary.len-1;i>=0;i--){
// printf("%d",binary.d[i]);
// }
// printf("\n");
//接下来是变成十进制
bign res;
res.len=1;
res.d[0]=0;//初始化为0
for(int i=binary.len-1;i>=0;i--){
bign unit;
unit.len=1;
unit.d[0]=binary.d[i];
bign tmp = multi(res,2);
res = add(unit,tmp);
}
//输出
for(int i=res.len-1;i>=0;i--){
printf("%d",res.d[i]);
}
printf("\n");
}
return 0;
}
码后反思
就是很繁琐,但是居然一次过题了,哈哈。加油。清华有高精度的!