NENU 进制转换

题目

1149: 5007 回文数

内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:admin
提交:52
解决:33
题目描述
如果一个数从左往右读和从右往左读都是一样的话,那么我们就称它是一个回文数。例如,75457就是一个回文数。
当然,这种性质要取决于这个数是在什么进制下。例如,17在十进制下不是一个回文数,但在二进制下(10001)则是一个回文数。
题目要求你来验证给定的数在2~16进制中的哪些进制下是否是回文数。
输入
输入文件包含了若干个十进制整数n,0 < n < 50000,每个整数占一行。0表示结束。
输出
如果整数i在某些进制下是回文数,则输出“Number i is palindrom in basis”,然后分别输出这些进制,其中i是给定的整数。如果在2~16进制下都不是回文数,则输出“Number i is not palindrom”。
样例输入 复制
17
19
0
样例输出 复制
Number 17 is palindrom in basis 2 4 16
Number 19 is not a palindrom

思路

这道题是课上写的,用了string和bool,只需要将其换成char和int就可以了
读入数据后从转换2进制到转换16进制,使用函数判断是不是回文
如果是就让整体判断为是

代码

#include <bits/stdc++.h>
using namespace std;
bool a = false;
bool t = false;

bool judge(int a, int b) {
	string temp;
	int i = 0;
	while (a) {
		if (a % b > 9) {
			temp[i++] = a % b - 10 + 'A';
		} else {
			temp[i++] = a % b + '0';
		}
		a /= b;
	}
	int left = 0;
	int right = i - 1;
	while (left < right) {
		if (temp[left] != temp[right]) {
			return false;
		}
		left++;
		right--;
	}
	return true;
}

int main() {
	int n;
	while (scanf("%d", &n) != EOF) {
		if (n == 0) {
			break;
		}
		a = false;
		printf("Number %d is ", n);
		for (int i = 2; i < 17; i++) {
			t = false;
			t = judge(n, i);
			if (t) {
				if (a) {
					printf(" %d", i);
				} else {
					printf("palindrom in basis %d", i);
					a = true;
				}
			}
		}

		if (!a) {
			printf("not a palindrom");
		}
		printf("\n");
	}

}

1154: 5201 二进制位

题目描述
给定你一个十进制数n(0 < n < 1000),要求输出其二进制数。

输入
输入有多行,每行包括一个十进制的正整数n。

输出
输出对应的二进制数。

样例输入
1 2 3

样例输出
1 10 11

思路

相比前面的题,这道题是一道简单的二进制转换题
使用函数转换即可

代码

#include <stdio.h>
int b(int a){
    if(a==0){
        return 0;
    }
    b(a/2);
    printf("%d",a%2);
    return 0;
}
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        b(n);
        printf("\n");
    }
}

1155: 5202 二进制转化为十六进制

内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较

题目描述
输入一个2进制的数,要求输出该2进制数的16进制表示。在16进制的表示中,A-F表示10-15。

输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个以0和1组成的字符串,字符串长度至少是1,至多是10000。
输出
n行,每行输出对应一个输入。

样例输入
2 100000 111

样例输出
20 7

思路

因为位数很多,所以这里我们不能再使用一个数来存输入,我们要用字符数组来读取数据
二进制转换成十六进制是4个变1个
记录好后我们存一下内容
注意二进制数的位数不一定是4的整数倍
注意存的时候的顺序
使用指针让函数直接处理字符数组

代码

#include <stdio.h>
#include <string.h>
#include <math.h>

void reverse(char b[], int len) {
	int left = 0;
	int right = len - 1;
	char t;
	while (left < right) {
		t = b[left];
		b[left] = b[right];
		b[right] = t;
		right--;
		left++;
	}
}

int main() {
	int n;
	scanf("%d", &n);
	while (n--) {
		char b[10005];
		char u[4000];
		scanf("%s", b);
		int lenb = strlen(b);
		int lenu = (lenb + 3) / 4;

		reverse(b, lenb);
		
		
		int k;
		for(k = lenb; k < 4*lenu;k++){
		    b[k] = '0';
		}
		b[4*lenu] = '\0';
		int j;
		for (j = 0; j < lenu; j++) {
			int temp = 0;
			int i;
			for (i = 0; i < 4; i++) {
				temp += (b[j * 4 + i] - '0') * pow(2, i);
			}
			if (temp > 9) {
				u[j] = temp - 10 + 'A';
			} else {
				u[j] = temp + '0';
			}
		}
		reverse(u, lenu);
		u[lenu] = '\0';
		printf("%s\n", u);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值