一、进制转换(字符串的操作)
在进制转换的过程中,操作的数字可能大于int的边界,所以我们需要使用字符串进行进制转换的操作。
string divide(string s,int x){
int re=0;
for(int i=0;i<s.length();i++){
int current = re*10+s[i]-'0';
s[i]=current/x+'0';
re=current%x;//若i位置的取余不为0,那么就在这个余数乘10的基础上加上后一位数字。
}
int pos=0;
while(s[pos]=='0'){//舍弃前面多余的0;
pos++;
}
return s.substr(pos);//将第一个不为0的字符串复制给s,并返回。
}
二、M进制转换为N进制
由于进制大于10,就需要用字符串表示,所以难点在于字符转整数,整数转int。
这个可以表示10进制转换成其他进制,或者其他进制之间的转换。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
char InttoChar(int x){
if(x<10){
return x+'0';
}else{
return x-10+'a';
}
}
int ChartoInt(char c){
if(c>='0'&&c<='9'){
return c-'0';
}else{
return c-'A'+10;
}
}
int main(){
int m,n;
cin>>m>>n;
string str;
cin>>str;
long long number = 0;
for(int i=0;i<str.size();i++){
number*=m;
number+=ChartoInt(str[i]);
}
vector<char>res;
while(number!=0){
res.push_back(InttoChar(number%n));
number/=n;
}
for(int i=res.size()-1;i>=0;i--){
cout<<res[i];
}
cout<<endl;
return 0;
}
三、两个字符串的相加,然后进行进制的转换
输入A、B两个在10进制范围内的数字,相加后求m进制的结果,但是A+B可能会超过10进制的范围,所以考虑用字符串来进行加法运算,其余的和上面的m转n进制相同。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1, s2, sum;
cin >> s1>>s2;
//较短的字符串放在第二位。
if (s1.size() < s2.size()){
string temp = s1;
s1 = s2;
s2 = temp;
}
int len = s1.size() - s2.size();
string s3(len, '0'); //较短的字符串前面补‘0’,使两个字符串等长。
s2 = s3 + s2;
int a = 0;
for (int i = s1.size() - 1; i >= 0; i--){
int b = (s1[i] - '0') + (s2[i] - '0') + a; //字符转化为数字,相加和大于9则进1;
if (b > 9){
sum.push_back((b-10)+'0'); //数字转化为字符,存入新字符串。
a = 1;
}else{
if(b==0){
break;
}else{
sum.push_back(b+'0'); //将最后一位进为插入新字符串。
a=0;
}
}
}
sum.push_back(a+'0');
for (string::reverse_iterator i = sum.rbegin(); i != sum.rend(); ++i) {//新字符串逆序输出。
cout << *i;
}
return 0;
}
四、最大公约、最小公倍
#include<iostream>
#include<string>
using namespace std;
int GCD(int a,int b){
if(b==0){
return a;
}else{
return GCD(b,a%b);
}
}
int main(){
int a,b;
cin>>a>>b;
cout<<GCD(a,b)<<endl;
cout<<"最小公倍"<<a*b/GCD(a,b)<<endl;
return 0;
}
五、素数判断、分解一个数的素数
#include<iostream>
#include<string>
using namespace std;
bool judge(int a){
if(a==1){
return false;
}
for(int i=2;i<=a/2;i++){
if(a%i==0){
return false;
}
}
return true;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
if(judge(i)){
cout<<i<<' ';
}
}
cout<<endl;
return 0;
}
六、分解质因数,重复的因子也输出
while (n > 1)
{
for (long i = 2; i <= n; i++)
{
if (n % i == 0)
{
n = n / i;
cout << i << " ";
break;
}
}
}
cou
七、快速幂
快速计算大次幂。如12的7次。
#include<iostream>
#include<string>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
int sum=1;
while(b!=0){
if(b%2==1){
sum*=a;
}
b/=2;
a*=a;
}
cout<<sum<<endl;
return 0;
}
八、求输入年月日距离1年1月1日所隔天数
int Getdays(int y,int m,int d)//求距离1年1月1日的距离
{
int month[12]= {31,28,31,30,31,30,31,31,30,31,30,31};
int year=y-1;
int days=year*365+year/4-year/100+year/400;//求出包括平年闰年的天数总和
if(y%4==0&&y%100!=0||y%400==0)//若当前年为闰年则二月加一天
month[1]=29;
for(int i=0; i<m-1; i++)
days+=month[i];
days+=d-1;
return days;
}