算法——进制转化与排版问题

算法——进制转化与排版问题

  • 十进制与二进制
      • 题目
      • 代码
      • 总结
  • 负二进制
      • 题目
      • 代码
      • 总结
  • 旋转矩阵
      • 题目
      • 代码
      • 总结

十进制与二进制

题目

算法——进制转化与排版问题_第1张图片

代码

#include
using namespace std;

int mod2(int x){
    if(x % 2 == 0){
        return 0;
    }else{
        return 1;
    }
}

string add(string x1, string x2){
    string ans = "";
    int op1 = x1.length()-1;
    int op2 = x2.length()-1;
    int flag = 0;
    while(op1 >= 0 && op2 >= 0){
        int t1 = x1[op1] - '0';
        int t2 = x2[op2] - '0';
        int ta = t1 + t2 + flag;
        if(ta > 9){
            flag = 1;
            ta = ta - 10;
        }else{
            flag = 0;
        }
        ans = char(ta + '0') + ans;
        op1--;
        op2--;
    }
    while(op1 >= 0){
        int t1 = x1[op1] - '0';
        int ta = t1 + flag;
        if(ta > 9){
            flag = 1;
            ta = ta - 10;
        }else{
            flag = 0;
        }
        ans = char(ta + '0') + ans;
        op1--;
    }
    while(op2 >= 0){
        int t2 = x2[op2] - '0';
        int ta = t2 + flag;
        if(ta > 9){
            flag = 1;
            ta = ta - 10;
        }else{
            flag = 0;
        }
        ans = char(ta + '0') + ans;
        op2--;
    }
    if(flag == 1){
        ans = '1' + ans;
    }
    return ans;
}
string div2(string x){
   int n = x.length();
   int flag = 0;
   string ans = "";
   int start = 0;
   for(int i = 0; i < n; i++){
       int temp = 0;
       if(flag == 1){
           temp = 10 + x[i] - '0';
       }else{
           temp = x[i] - '0';
       }
       char n = temp / 2 + '0';
       if(n == '0' && start == 0){
           flag = temp % 2;
           continue;
       }else{
           start = 1;
       }
       ans += n;
       flag = temp % 2;
   }
   return ans;
}

string mul(string x1, int x2){
    string ans = "";
    int flag = 0;
    for(int i = x1.length() - 1; i >= 0; i--){
        int tx = x1[i] - '0';
        int temp = tx * x2 + flag;
        flag = temp / 10;
        ans = char(temp % 10 + '0') + ans;
    }
    if(flag != 0){
        ans = char(flag + '0') + ans;
    }
    return ans;
}

int main(){
    string s;
    stack<int> ans;
    cin >> s;
    while(s != ""){
        int t = mod2(s[s.length()-1]);
        ans.push(t);
        s = div2(s);
    }
    string temp = "1";
    string a = "0";
    while(!ans.empty()){
        int t = ans.top();
        ans.pop();
        a = add(a,mul(temp, t));
        temp = mul(temp, 2);

    }
    int f = 0;
    for(int i = 0; i < a.length(); i++){
        if(f == 0 && a[i] == '0'){
            continue;
        }else{
            f = 1;
            cout<<a[i];
        }
    }
	cout<<'\n';
    return 0;
}

总结

对于大整数问题,c++采用字符串来模拟。对于加法与乘法,不要忘记其最后一个进位制的单独判断。
对于十进制转其他进制就是先模再除。
对于其他进制转十进制就是累加与累乘。
在这里的字符串加减乘除都是采用模拟的方法。

负二进制

题目

算法——进制转化与排版问题_第2张图片

代码

 #include
using namespace std;

int main(){
	int n = 0;
	while(cin>>n){
        int temp = -2;
        // int sum = 0;
        stack<int> ans;
		if(n == 0){
			cout<<0<<endl;
			continue;
		}
        while(n != 0){
            int t = abs(n % -2);
            ans.push(t);
            n -= t;
            n /= -2;
        }
        while(!ans.empty()){
            int t = ans.top();
            ans.pop();
            cout<<t;
        }
        cout<<endl;
	}
	return 0;
}

总结

算法——进制转化与排版问题_第3张图片

旋转矩阵

题目

算法——进制转化与排版问题_第4张图片

代码

#include
using namespace std;


int book[21][21];
int top[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int main(){
	int n;
	cin >> n;
	int op = 1;
	int tx = 0;
	int ty = 1;
	int f = 0;
	while(op <= n * n){
		tx += top[f][0];
		ty += top[f][1];
		if(0 < tx && tx <= n && 0 < ty && ty <= n && book[tx][ty] == 0){

		}else{
			tx -= top[f][0];
			ty -= top[f][1];
			f = (f + 1)%4;
			tx += top[f][0];
			ty += top[f][1];
		}
		book[tx][ty] = op;
		op++;
	}
	for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            printf("%-4d", book[i][j]);
        }
        printf("\n");
	}
	return 0;
}

总结

这类问题数组辅助模拟就可(如果是翻转旋转可以找i,j的关系即可)

你可能感兴趣的:(算法,算法)