複試上機指南之小技巧篇(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;
}

九、高精度正整數,僅限於正整數的加、減、乘、除、取模、輸入、輸出

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