
这题被除数的范围很大,只能用字符串写
首先,我们需要掌握的三个前置知识
第一个函数div除法
第二个函数mul乘法(秦九韶算法)
第三个函数add加法
除法
vector<int> div(vector<int>&vt,int b,int &r){ //vt存储高精度被除数,b表示除数,r表示余数 vector<int>st; r=0; for(int i=0;i<vt.size();i++)/*vt从高到低存储,除法也是从高到低计算, 下面是模拟除法的一个过程,不理解的可以自己举例子*/ { r=r*10+vt[i]; st.push_back(r/b); r%=b; } /* st.size()>1保证结果商为0是被允许的,但00不允许 例如:被除数10382 除数2 商是05191 */ while(st.size()>1&&st[0]==0)st.erase(st.begin());//删除前导零 return st; }
乘法(秦九韶算法)
将 x 替换为2,就是一个二进制转十进制表达式,该式子可以转化为:
乘法和加法的结合。
vector<int> mul(vector<int>&vt,int b)//vt从高到低存储高精度数,b是乘数 { vector<int>st; for(int i=vt.size()-1,t=0;i>=0||t;i--)/*逆序遍历vt,因为乘法是从低位到高位运算的, t记录进位*/ { t+=vt[i]*b; st.push_back(t%10); t/=10;//如果进位了t会大于0,在c++里表示true,那么就算vt遍历完,也会再进行一次循环 } return st;//这里st是从低到高位存储高精度数 }
加法
vector<int> add(vector<int>&vt,int b)//vt从低到高存储,b表示低精度加数 { vector<int>st; for(int i=0,t=b;i<vt.size()||t;i++) { if(i<vt.size())t+=vt[i]; st.push_back(t%10); t/=10;//t每次取余数,然后除以十,保证每次取到最低位,然后相加 } return st; }
正确题解
#include<bits/stdc++.h> using namespace std; vector<int> div(vector<int>&vt,int b,int &r){ vector<int>st; r=0; for(int i=vt.size()-1;i>=0;i--) { r=r*10+vt[i]; st.push_back(r/b); r%=b; } reverse(st.begin(),st.end()); while(st.size()>1&&st.back()==0)st.pop_back(); return st; } vector<int> mul(vector<int>&vt,int b) { vector<int>st; for(int i=0,t=0;i<vt.size()||t;i++) { if(i<vt.size())t+=vt[i]*b; st.push_back(t%10); t/=10; } while(st.size()>1&&st.back()==0)st.pop_back(); return st; } vector<int> add(vector<int>&vt,int b) { vector<int>st; for(int i=0,t=b;i<vt.size()||t;i++) { if(i<vt.size())t+=vt[i]; st.push_back(t%10); t/=10; } return st; } void print(vector<int>vt) { for(int i=vt.size()-1;i>=0;i--) printf("%d",vt[i]); puts(""); } int main(void) { string s; cin>>s; vector<int>vt; for(int i=s.size()-1;i>=0;i--) vt.push_back(s[i]-'0'); vector<int>TwoNum; while(vt.size()>1||vt[0]>0) { int r; vt=div(vt,2,r); TwoNum.push_back(r);//每次取除2之后的余数 } /*TwoNum是逆序存储二进制数的,因为题目要求要逆序一次 所以不需要再逆序一边,可以直接遍历*/ vector<int>res; for(auto x:TwoNum) { res=mul(res,2);//这里用到秦九韶算法,先乘2再加 res=add(res,x);//不理解的可以去套一下公式 } print(res); return 0; }声明:
我这里的三个函数都是从低到高位存储,上面前置知识的那三个函数我为了便于理解是按照从高到低位存储去分别完成加法、乘法、除法的功能。



208

被折叠的 条评论
为什么被折叠?



