机试学习笔记02 -- 简单模拟与进制转换

1. 多组输入问题–补充上篇

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int a, b;
	while(scanf("%d%d", &a, &b) != EOF){
		scanf("%d%d", &a, &b)
		printf("%d\n", a + b); 
	} 
	return 0;
}

2. 简单模拟

理解题目意思,直接模拟计算

计算1-n的和:

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n;
	scanf("%d", &n);
	int sum = 0; //注意初始化! 
	for(int i = 1; i <= n; i++){
		sum += i;
	}
	printf("%d", sum);
	return 0;
}

//注意边界值检测,不要只管样例 

求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。 例如:2+22+222+2222+22222(n=5)

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int a, n;
	scanf("%d%d", &a, &n);
	int sn = 0, num = a;
	for(int i = 0; i < n; ++i){
		sn += num;
		num = num * 10 + a; //任意数都是上一个数*10+a得到 
		//num = a * pow(10, i + 1) + num;
	}
	printf("%d",sn);
	return 0;
}

3. 进制转换

反序数

设N是一个四位数,它的9倍恰好是其反序数(例如:1234的反序数是4321)
求N的值

#include <bits/stdc++.h>
using namespace std;

int main()
{
	for(int i = 1000; i <= 9999; ++i){
		int x = i * 9;
		int y = 0, z = i;
		while(z > 0)
		{
			y = y * 10 + z % 10;
			z = z / 10;
		}
		if(x == y){
			cout << i << endl;
		}
	} 
	return 0;
}

10进制转x进制(x<10)

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n;
	scanf("%d", &n);
	int ans = 0;
	int a[105] = {0}, cnt = 0;
	while(n > 0){//核心循环 
		ans = n % 2;
		a[cnt++] = ans;
		n /= 2;
	}
	int sum = 0;
	for(int i = cnt - 1; i >= 0; i--){//反序
		printf("%d", a[i]);
		//sum = sum * 10 + a[i]; //输出为数字 
	}
	cout << sum
	return 0;
}

10进制转x进制(x>=10)

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n;
	scanf("%d", &n);
	int ans = 0;
	int a[105] = {0}, cnt = 0;
	while(n > 0){//核心循环 
		ans = n % 16;
		if(ans < 10) a[cnt++] = ans + '0';
		else a[cnt++] = (ans - 10) + 'A';
		n /= 16;
	}
	
	for(int i = cnt - 1; i >= 0; i--){
		printf("%c", a[i]); //记得打印为字符 
	}
	return 0;
}

x进制转10进制(x==2)

#include <bits/stdc++.h>
using namespace std;

int main()
{
	char s[105];
	scanf("%s", s);
	int ans = 0;
	int len = strlen(s);
	for(int i = 0; i < len; ++i){
		ans = ans * 2 + (s[i] - '0'); 
	}
	cout << ans;
	return 0;
}

x进制转10进制(x>10)

#include <bits/stdc++.h>
using namespace std;

int main()
{
	char s[105];
	int x;
	scanf("%s%d", s, &x);
	int ans = 0;
	int len = strlen(s);
	for(int i = 0; i < len; ++i){
		ans = ans * x;
		if(s[i] >= '0' && s[i] <= '9') ans += (s[i] - '0');
		else ans += (s[i] - 'A' + 10);		
	}
	cout << ans;
	return 0;
}

x进制转y进制

#include <bits/stdc++.h>
using namespace std;

int main()
{//x y 都应该是字符串,只有十进制ans为数字 
	char s[105];
	int x, y;
	scanf("%s%d%d", s, &x, &y);
	int ans = 0;//为10进制结果 
	int len = strlen(s);
	for(int i = 0; i < len; ++i){
		ans = ans * x;
		if(s[i] >= '0' && s[i] <= '9') ans += (s[i] - '0');
		else ans += (s[i] - 'A' + 10);		
	}
	int n = ans;
	int ans_y = 0;
	int a[105] = {0}, cnt = 0;
	while(n > 0){//核心循环 
		ans_y = n % y;
		if(ans_y < 10) a[cnt++] = ans_y + '0';
		else a[cnt++] = (ans_y - 10) + 'A';
		n /= y;
	}
	
	for(int i = cnt - 1; i >= 0; i--){
		printf("%c", a[i]); //记得打印为字符 
	}

	return 0;
}

总结

核心就是数位的拆解合并(10->x,x->10),拆解就是先取模,再除取整,合并就是先乘再加

练习

将一个长度最多为30位数字的十进制非负整数转换为二进制数输出

太长了,超过18位,longlong存不下,考虑用字符串存储
字符串模2,看尾数;除2,切半(有余数则下一位加(余数*10))。

#include <bits/stdc++.h>
using namespace std;

bool allzero(char s[], int len)
{
	bool flag = 1; //全部为0 
	for(int i = 0; i < len; ++i){
		if(s[i] != '0'){
			flag = 0;
			break;
		}
	}
	return flag;
}

void divide(char s[], int len)
{
	int res = 0, r = 0; 
	res = (s[0] - '0') % 2;
	s[0] = (s[0] - '0') / 2 + '0';
	for(int i = 1; i < len; ++i){
		r = (s[i] - '0') % 2;
		s[i] = (s[i] - '0' + 10 * res) / 2 + '0';
		res = r;
	}
}

int main()
{
	char s[35];
	while(scanf("%s", s) != EOF){
		int len = strlen(s);
		char a[1005], cnt = 0;
		while(!allzero(s, len)){
			a[cnt++] = s[len-1] % 2 + '0';
			//printf("%c", a[cnt-1]);
			divide(s, len);
			len = strlen(s);
		}
		for(int i = cnt - 1; i >= 0; --i){
			printf("%c", a[i]);
		}
		printf("\n");
	}
	
	return 0;
}

1176.对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。 例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。

未得到答案,之后补充

二进制转换的问题,想必大家都没有问题了吧,比如给你一个十进制数13,其对应的二进制表示为:1101。因为13=123+1*22+021+1*20.江鸟整天胡思乱想,现在他想到一个问题:如果将平时二进制转换过程中的基数2变成-2,那么转换过来的数将又是什么呢?江鸟将这种转换方式称为“负二进制转换”,为了让大家接受他的理论,他举了个例子如下:
1*(-2)3+1*(-2)2+0*(-2)1+1*(-2)0=-3,所以-3的该种转换为1101.

#include <bits/stdc++.h>
using namespace std;


int main()
{

    int n;
    while(cin >> n){
    	int a[105], cnt = 0;
    	if(n == 0) cout << 0; 
    	while(n != 0){ //不能是n>0,因为输入小于0 
			a[cnt] = n % (-2);
    		n /= (-2);
    		if(a[cnt] == -1){
    			a[cnt] = 1;
    			n++;
			}
			cnt++;
		}
    	for(int i = cnt - 1; i >= 0; --i){
    		cout << a[i];
		}
		cout << endl;
	}

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值