E. 八进制小数
单点时限: 2.0 sec
内存限制: 256 MB
写一个程序将 0 与 1 (不包括 0 和 1)之间的八进制数转化为等价的十进制数。
例如,八进制数 0.75 就是十进制数 0.953125(7×8−1+5×8−2)。
小数点右边有 n 位的所有八进制数都可以转化为小数点右边至多有 3×n 位的十进制数。
输入格式
第 1 行:一个整数 T (1≤T≤10) 为问题数。
接下来有 T 行,对应每个问题有 1 行,每行有一个八进制,该八进制数的形式为 0.d1d2d3d4…dk,其中 di(1≤i≤k)是八进制数码(0
~7
),k<50。
输出格式
对于每个问题,输出一行问题的编号(0
开始编号,格式:case #0:
等)。
然后对应每个问题在一行中输出转化后的等价十进制数。注意尾部不要输出多余的 0
。
样例
input
3 0.75 0.0001 0.01234567output
case #0: 0.953125 case #1: 0.000244140625 case #2: 0.020408093929290771484375
本题难度主要在于如何输出不同位数的十进制小数
#include <stdio.h>
#include <string.h>
const int N=1005;
int main()
{
char str[N];
char dest[N];
int T;
scanf("%d",&T);
for(int m = 0; m < T; m++){
int i,j,k,tmp;
scanf("%s",str);
k=0;
memset(dest,0,sizeof(dest));
int len=strlen(str);
for(i=len-1;i>1;i--){
int num=str[i]-'0';
for(j=0;j<k || num!=0;j++){
tmp=10*num+(j<k?dest[j]-'0':0);
dest[j]=tmp/8+'0';
num=tmp%8;
}
k=j;
}
printf("case #%d:\n0.%s\n", m,dest);
}
return 0;
}
1004. 内存显示——简单题
单点时限: 2.0 sec
内存限制: 256 MB
一个 int
类型变量或 double
类型变量在连续几个字节的内存中存放。读取数值时,当数值中包含小数点时类型为 double
,否则类型为 int
。将读入的数值存放在 int
类型变量或 double
类型变量中。以十六进制格式(a
-f
字母采用小写形式)输出相应变量的连续的每个字节的值。
读入的数据保证能在一个 int
类型或 double
类型变量中正确存放。
注意:int
类型变量和 double
类型变量所占字节数以及一个变量的几个字节的存放顺序与所用计算机的体系结构和编译系统有关。
输入格式
每一行包含一个数值
输出格式
每行对应一个数据,每个字节后面都要输出一个空格
样例
input
1 -1 0 3.14 0.0 -1.0output
01 00 00 00 ff ff ff ff 00 00 00 00 1f 85 eb 51 b8 1e 09 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f0 bf
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void solveint(int n);
void solvedouble(double d);
int main() {
char s[31];
s[30] = '\0' ;
while (scanf("%s", s) != EOF)
{
if (strchr(s, '.') == 0)
solveint(atoi(s));
else
solvedouble(atof(s));
}
return 0;
}
void solveint(int n) {
int c = sizeof(n);
unsigned char* p = (unsigned char*)&n;
while (c--)
printf("%02x ", *p++);
printf("\n");
}
void solvedouble(double d) {
int c = sizeof(d);
unsigned char* p = (unsigned char*)&d;
while (c--)
printf("%02x ", *p++);
printf("\n");
}