问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。 注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。 样例输入 FFFF 样例输出 65535
分析:按16进制展开;按数位依次操作,每次将前面的乘16,再加上当前数位的值。
C语言代码
#include<stdio.h>
#include<string.h>
#include<math.h>
int main(){
char strHex[10]; //设定字符串长度
int i = 0, len = 0, temp = 0;
long long answer = 0;
gets(strHex);
len = strlen(strHex);
for (i = 0; strHex[i] != '\0'; ++i){
switch(strHex[i]){
case 'A': temp = 10; break;
case 'B': temp = 11; break;
case 'C': temp = 12; break;
case 'D': temp = 13; break;
case 'E': temp = 14; break;
case 'F': temp = 15; break;
default: temp = strHex[i]-'0'; break;
}
answer += (temp*pow(16,len-1-i)); //pow函数作用:计算x的 y次方
}
printf("%lld",answer);
return 0;
}
C++代码
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
while(cin>>s)
{
int leth=s.length();
long long sum=0;
for(int i = 0;i < leth;i++)
{
if(s[i]>='A' && s[i]<='F')
sum=sum*16 + s[i]-'A'+10;
else
sum=sum*16 + s[i]-'0';
}
cout<<sum<<endl;
}
return 0;
}
问题描述 给定n个十六进制正整数,输出它们对应的八进制数。 输入格式 输入的第一行为一个正整数n (1<=n<=10)。 接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。 输出格式 输出n行,每行为输入对应的八进制正整数。 注意 输入的十六进制数不会有前导0,比如012A。 输出的八进制数也不能有前导0。 样例输入 2 39 123ABC 样例输出 71 4435274 提示 先将十六进制数转换成某进制数,再由某进制数转换成八进制。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MaxSize 100000
void saveB(char *b,char c3,char c2,char c1,char c0,int start)
{
b[start]=c3;
b[start+1]=c2;
b[start+2]=c1;
b[start+3]=c0;
}
int htob(char *h,char *b)
{
int i,j;
int hl=strlen(h);
for(i=0;i<hl;i++)
switch(h[i])
{
case '0':
{
saveB(b,'0','0','0','0',4*i);
break;
}
case '1':
{
saveB(b,'0','0','0','1',4*i);
break;
}
case '2':
{
saveB(b,'0','0','1','0',4*i);
break;
}
case '3':
{
saveB(b,'0','0','1','1',4*i);
break;
}
case '4':
{
saveB(b,'0','1','0','0',4*i);
break;
}
case '5':
{
saveB(b,'0','1','0','1',4*i);
break;
}
case '6':
{
saveB(b,'0','1','1','0',4*i);
break;
}
case '7':
{
saveB(b,'0','1','1','1',4*i);
break;
}
case '8':
{
saveB(b,'1','0','0','0',4*i);
break;
}
case '9':
{
saveB(b,'1','0','0','1',4*i);
break;
}
case 'A':
{
saveB(b,'1','0','1','0',4*i);
break;
}
case 'B':
{
saveB(b,'1','0','1','1',4*i);
break;
}
case 'C':
{
saveB(b,'1','1','0','0',4*i);
break;
}
case 'D':
{
saveB(b,'1','1','0','1',4*i);
break;
}
case 'E':
{
saveB(b,'1','1','1','0',4*i);
break;
}
case 'F':
{
saveB(b,'1','1','1','1',4*i);
break;
}
}
return 4*hl;
}
int btoo(char *b,char *o,int bl)
{
int i,j;
int ol;
int value;
if(bl%3==0)
ol=bl/3;
else
ol=bl/3+1;
j=bl-1;
for(i=ol-1;i>=0;i--)
{
if(i>0)
o[i]=b[j]-48+(b[j-1]-48)*2+(b[j-2]-48)*4+48;
else
{
switch(j)
{
case 2:
o[i]=b[j]-48+(b[j-1]-48)*2+(b[j-2]-48)*4+48;
break;
case 1:
o[i]=b[j]-48+(b[j-1]-48)*2+48;
break;
case 0:
o[i]=b[j];
break;
}
}
j=j-3;
}
return ol;
}
void printO(char *o,int ol)
{
int i=0;
if(o[0]=='0')
i=1;
for(;i<ol;i++)
{
printf("%c",o[i]);
}
printf("\n");
}
main()
{
char h[MaxSize];
char b[4*MaxSize];
char o[4*MaxSize/3+1];
int n,i,bl,ol;
scanf("%d",&n);
getchar();
for(i=0;i<n;i++)
{
gets(h);
bl=htob(h,b);
ol=btoo(b,o,bl);
printO(o,ol);
}
}
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <STDLIB.H>
int GetI(char c)
{
return c>>4&1?c&15:(c&15)+9;
}
int main(int argc, char *argv[]) {
char arr[200001] = {'\0'};
char brr[400001] = {'\0'};
int n = 0;
int i = 0;
scanf("%d",&n);
for(i = 0;i < n;i++)
{
scanf("%s",arr);
int m[3] = {1,16,256};
int len = strlen(arr);
int j = len-1;
int a,b,c;
a = b = c = 0;
int k = 0,l = 0;
int count = 0;
while(j>-1)
{
a += (arr[j]>>4&1?arr[j]&15:(arr[j]&15)+9)*m[k]; //个位
if(k==2||j==0)
{
while(a)
{
brr[l++] = ((a&7)|48);
a = a>>3;
count++;
}
while(j!=0&&count<4)
{
brr[l++] = '0';
count++;
}
count = 0;
}
k = (k+1)%3;
j--;
}
strrev(brr);
printf("%s\n",brr);
memset(arr,'\0',(sizeof(char)*200001));
memset(brr,'\0',(sizeof(char)*400001));
}
return 0;
}
问题描述 十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。 给出一个非负整数,将它表示成十六进制的形式。 输入格式 输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647 输出格式 输出这个整数的16进制表示 样例输入 30 样例输出 1E
#include <stdio.h>
#include <stdlib.h>
char data[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
void Print(char *num,int n)
{
int i;
for(i=n-1;i>=0;i--)
printf("%c",num[i]);
printf("\0");
printf("\n");
}
//将十六进制数转换为十进制数
int Transform(char *num,long long value)
{
int n=0;
while(value>=16)
{
num[n++]=data[value%16];
value/=16;
}
num[n++]=data[value%16];
return n;
}
int main()
{
long long value;
char num[10];
int n;
scanf("%I64d",&value);
n=Transform(num,value);
Print(num,n);
return 0;
}