涉及字符串2进制和十进制的互相转化 定义字符串加,乘,除函数。算法有点复杂。

10进制 VS 2进制

http://www.nowcoder.com/questionTerminal/fd972d5d5cf04dd4bb4e5f027d4fc11e

//题目说的是1000位的数  不是1000以内的数  只能用字符串的形式计算而不能用int long等整型;
#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
using namespace std;
string str;
vector<int>v;
void divide(){//字符串除法;
    int remain=0;
    for(int i=0;i<str.size();++i){
        int temp=remain*10+str[i]-'0';
        remain=temp%2;
        str[i]=temp/2+'0';
    }
    while(str[0]=='0')
        str.erase(0,1);
}
string multiple(string answer,int x){//字符串answer乘以x
    int CF=0;
    for(int i=answer.size()-1;i>=0;i--){
        char temp=answer[i];
        answer[i]=((answer[i]-'0')*x+CF)%10+'0';
        CF=((temp-'0')*x+CF)/10;
    }
    if(CF!=0)//检查最高位是否有进位
        answer.insert(0,"1");
    return answer;
}
string add(string answer,int x){//字符串加法
    int CF=x;
    for(int i=answer.size()-1;i>=0;i--){
        int temp=answer[i]-'0'+CF;
        answer[i]=temp%10+'0';
        CF=temp/10;
    }
     if(CF!=0)//检查最高位是否有进位
        answer.insert(0,"1");
    return answer;
}

int main(){
    cin>>str;
    while(!str.empty()){//十进制化为2进制装入容器v中
        v.push_back((str.back()-'0')%2);
        divide();
    }
    while(v[0]==0)//得到逆序的2进制 去掉最前面的0
        v.erase(v.begin(),v.begin()+1);
 
    string answer="0";
    for(int i=0;i<v.size();++i){//二进制化为10进制
        answer=multiple(answer,2);
        answer=add(answer,v[i]);
    }
    cout<<answer<<endl;
    return 0;
}

全部评论

相关推荐

10-29 15:38
门头沟学院 Java
榕城小榕树:难道你简历里写了配送路径优化算法?
点赞 评论 收藏
分享
11-15 18:39
已编辑
西安交通大学 Java
全村最靓的仔仔:卧槽,佬啥bg呢,本也是西交么
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务