算法竞赛--进制转换(二)

利用c语言的格式输入格式输出,直接进行进制转换。

%X 对应大写字母的十六进制
%d 对应输出十进制
%o 对应输出八进制

1.进制转换

程序提示用户输入三个字符,每个字符取值范围是0-9,A-F。然后程序会把这三个字符转化为相应的十六进制整数,并分别以十六进制,十进制,八进制输出。

输入信息:

输入只有一行,即三个字符。

输出信息:

三个整数,中间用空格隔开。

样例输入:

1
FFF

样例输出:

1
FFF 4095 7777

代码如下:

1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
int n;
scanf("%x",&n);
printf("%X %d %o",n,n,n);
return 0;
}

2.二进制移位练习

求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。不同进制的表示符号为(0,1,…,9,a,b,…,f)或者(0,1,…,9,A,B,…,F)。

输入信息:

一个正整数a。

输出信息:

a从右端开始的4至7位的10进制表示。请注意行尾输出换行。

样例输入:

1
217

样例输出:

1
13

思路:输入一个十进制数,转换为二进制并存储在数组中,取数组的四到七位,转换为十进制.

注意:取数组的4-7位,取3-6位恰好也会输出13,一直WA50%。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
int temp[1010]={0};
int main()
{
int n,count=0;
scanf("%d",&n);
do //十进制转换为二进制。
{
temp[count++]=n%2;
n=n/2;
}while(n>0);
int sum=0,c=1;
for(int i=4;i<=7;i++) 取4-7位并转换为十进制。
{
sum+=temp[i]*c;
c=c*2;
}
printf("%d\n",sum);
return 0;
}

3.三进制小数

你的任务呢,是将一个有理数转换成三进制小数。“什么是三进制小数呢?”你一定会问,这很明白,就是以三为基(二进制数以2为基,而十进制数则以10为基)的小数。

输入信息:

有理数的值都是在0与1之间的,每个有理数都由一个分子和一个分母表示,分子与分母之间隔着一个斜杠。有理数的个数不会超过1000个。

输出信息:

输出格式见样本输出,它是以小数点开头的具有10位精度的3进制数。

样例输入:

1
2
3
4
1/3
1/4
1/6
7/8

样例输出:

1
2
3
4
.1000000000
.0202020202
.0111111111
.2121212122

思路:用字符数组接收,将每个字符转换为整型,从最后一个数字开始逐步除二取余,存储在新数组中,再将整个数除二存储。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
int main()
{
int n,m;
double s;
while(scanf("%d/%d",&n,&m)==2)
{
int temp[12]={0};
s=1.0*n/m; //将十进制小数进行存储
for(int i=0;i<11;i++)
{
s=s*3;
temp[i]=(int)s;
s-=temp[i];
}
if(temp[10]>=1.5)
temp[9]++;
for(int i=9;i>0;i--)
{
if(temp[i]==3)
{
temp[i-1]++;
temp[i]=0;
}
}
printf(".");
for(int i=0;i<=9;i++)
printf("%d",temp[i]);
printf("\n");
}
return 0;
}
小礼物走一个哟
0%