复试上机指南之小技巧篇(2)

一、进制转换(字符串的操作)

在进制转换的过程中,操作的数字可能大于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;
}

九、高精度正整数,仅限于正整数的加、减、乘、除、取模、输入、输出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章