题目
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);
}
}