上次呢,我们留下了一道题,今天我们来一起看一看:
题目链接:https://www.cnblogs.com/gaozirong/p/10547434.html
这是我写的程序,大家可以对照参考一下(C++):
#include<bits/stdc++.h> using namespace std; long long n,x,m; long long f(long long a,long long k) {//快速幂求a^kif(k==0)return 1;if(k==1)return a%n;if(k%2==0)return f((a%n)*(a%n)%n,k/2)%n;else return (f((a%n)*(a%n)%n,k/2)*(a%n))%n; } int main() {long long k;cin>>n>>m>>k>>x;cout<<(x%n+((m%n)*(f(10,k)%n)%n))%n;return 0; }
今天我们来讲一讲进制,首先,进制是什么?
进制也就是进位计数制,是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tally mark计数)。 对于任何一种进制---X进制,就表示每一位置上的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。
现在常用的是十进制、二进制、八进制和十六进制,今天我们一起来看一看进制转换。
如何转换?
就以十进制转换成二进制为例:
例如,十进制的115转换为二进制:(详见下图)
十进制转换成二进制运用的是短除法。如果x进制转换为y进制,就要先把x转换为十进制数,然后在用十进制数转换为y进制数。
参考代码:
参考代码分为几种不同的点,供你们参考:
//二进制转换成八进制: #include<bits/stdc++.h> using namespace std; string num[]={"0","1","2","3","4","5","6","7"}; string f(string s) {int sum=0,j=1;//j表示的是2的多少次幂 if(s.size()<=3)//这是边界,求出s对应的十进制数 {for(int i=s.size()-1;i>=0;i--){sum+=(s[i]-'0')*j;j*=2; }return num[sum];}string s1=s.substr(s.size()-3,3);//截取最后三个字符string s2=s.substr(0,s.size()-3);//截取前面的部分return f(s2)+f(s1); } int main() {string s;cin>>s;cout<<f(s);return 0; }
//十六进制转换成二进制: #include<bits/stdc++.h> using namespace std; string num[]={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"}; //num[i]表示的是十六进制数i对应的二进制数 string f(string s) {if(s.size()==1){if(s[0]>='0'&&s[0]<='9')//如果是数字,对应的二进制数 return num[s[0]-'0'];return num[s[0]-'A'+10];//处理字母 }string s1=s.substr(s.size()-1,1);string s2=s.substr(0,s.size()-1);return f(s2)+f(s1); } int main() {string s;cin>>s;string S=f(s);while(S[0]=='0')//去除前导0 S.erase(0,1);cout<<S;return 0; }
//二进制转换成十六进制: #include<bits/stdc++.h> using namespace std; string num[]={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; string f(string str) {if(str.size()<=4){int sum=0,i=1;for(int j=str.size()-1;j>=0;j--){sum+=(str[j]-'0')*i;i*=2;}return num[sum];}string s1=str.substr(0,str.size()-4);string s2=str.substr(str.size()-4,4);return f(s1)+f(s2); } int main() {string str;cin>>str;cout<<f(str);return 0; }
//八进制转换成二进制: #include<bits/stdc++.h> using namespace std; string num[]={"000","001","010","011","100","101","110","111"}; //num[i] 表示的是i对应的的二进制数 string f(string str) {if(str.size()==1)return num[str[0]-'0'];string s1=str.substr(0,str.size()-1);string s2=str.substr(str.size()-1,1);return f(s1)+f(s2); } int main() {string str;cin>>str;string S=f(str);while(S[0]=='0')//去除前导0 S.erase(0,1);cout<<S;return 0; }
今天的进制转换和上期的快速幂一定要复习哦!