写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串(注意可能存在的一个测试用例里的多组数据)。
#include <stdio.h>
#include <string.h>
#define N 200
int main()
{
int x, n;
char str[N];
while(gets(str))
{
n=0;
int len=strlen(str);
for(int i=2; i<len; i++)
{
if('0'<=str[i]&&str[i]<='9') x=str[i]-'0';
else if('a'<=str[i]&&str[i]<='z') x=str[i]-'a'+10;
else x=str[i]-'A'+10;
n=n*16+x;
}
printf("%d\n", n);
}
return 0;
} #include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
const int maxM = 36; // 最大进制数 '0'-'9' + 'a'-'z' 共 36 种
const int maxn = 10000;
int M = 16; // 原始进制
int N = 10; // 目标进制
string str; // 存储输入
// 所有数组 0 号元素均表示数组长度
int dr[maxn]; // 存储由字符串转过来的大数
int drans[maxn]; // 求余过程中的商
int drres[maxn]; // 余数
map<char, int> mci; // 字符与数字对应的map
map<int, char> mic; // 数字与字符对应的map
// 字符与数值对应map初始化
void initialization()
{
// 字符与数字对应的map构建
for(int i = 0; i < maxM; ++i)
{
if(i < 10)
{
// '0' - '9'
mci['0'+i] = i;
mic[i] = '0'+i;
}
else
{
// 'a' - 'z'
mci['a'+i-10] = i;
mic[i] = 'a'+i-10;
}
}
}
// 判断是否是大写字母
int isCapital(char ch)
{
if(ch >= 'A' && ch <= 'Z')
{
return 1;
}
else
{
return 0;
}
}
// 字符串预处理,并给存储原始进制的数组赋值
void pretreatment()
{
// 将所有大写字母转换成小写
for(int i = 0; i < str.length(); ++i)
{
// 大写字母转小写
if(isCapital(str[i]) == 1)
{
str[i] = 'a' + str[i] - 'A';
}
}
// 给存储原始进制的数组赋值
memset(dr, 0, sizeof(dr));
// i 从 2 开始排除前面的 0x
for(int i = 2; i < str.length(); ++i)
{
dr[++dr[0]] = mci[str[i]];
}
}
// 将 M 进制的 dr 转换成 N 进制
void solve()
{
memset(drres, 0, sizeof(drres));
int i, j, y;
// 模 n 取余法,(总体规律是先余为低位,后余为高位)
while(dr[0] >= 1)
{
// 只要被除数仍然 >= 1,则继续操作
y = 0;
i = 1;
drans[0] = dr[0]; // 商的长度与被除数相同(包含前导0)
while(i <= dr[0])
{
y = y * M + dr[i];
drans[i++] = y / N;
y %= N;
}
drres[++drres[0]] = y; // 本轮计算得到的余数
i = 1;
// 找到下一轮商的起始位置
while((i<=drans[0]) && (drans[i] == 0)) ++i;
// 清除这一轮使用的被除数
memset(dr, 0, sizeof(dr));
// 本轮得到的商为下一轮的被除数
for(j = i; j <= drans[0]; ++j)
{
dr[++dr[0]] = drans[j];
}
// 清除本轮的商
memset(drans, 0, sizeof(drans));
}
}
// 输出 N 进制的结果
void output()
{
for(int i = drres[0]; i >= 1; --i)
{
cout << mic[drres[i]];
}
}
int main()
{
initialization(); // 字符与数值对应的map的构建
while(cin >> str)
{
pretreatment(); // 预处理字符串,并给存储原始进制的数组赋值
solve(); // 将 M 进制的 dr 转换成 N 进制
output(); // 输出 N 进制的结果
cout << endl;
}
return 0;
}
#include <stdio.h>
#include <string.h>
int main()
{
int len,i,j,p;
int r,t;
char s[100],b[100000];
int d[100];
while(scanf("%s",&s)!=EOF)
{
len=strlen(s);
for(i=2;i<len;i++)
{
if(s[i]>='A'&&s[i]<='F')
d[i]=10+s[i]-'A';
else if(s[i]>='a'&&s[i]<='f')
d[i]=10+s[i]-'a';
else
d[i]=s[i]-'0';
}
for(i=2,p=0;i<len;)
{
for(j=i,r=0;j<len;j++)
{
t=r*16+d[j];
d[j]=t/10;
r=t%10;
}
b[p++]=r+'0';
while(d[i]==0) i++;
}
for(i=p-1;i>=0;i--) printf("%c",b[i]);
printf("\n");
}
} #include<stdio.h>
(737)#include<string.h>
#include<math.h>
int main()
{
char a[10],b[17]="0123456789ABCDEF";//利用下标代表ABCDEF
int sum,i,j,num;
while(scanf("%s",a)!=EOF)
{
num=0;sum=0;
for(i=strlen(a)-1;i>=2;i--)
for(j=0;j<=15;j++)
if(a[i]==b[j])
{
sum+=j*pow(16,num);
num++;
}
printf("%d\n",sum);
}
} /*
大数,m进制转10进制
10000进制版本
*/
#include <bits/stdc++.h>
using namespace std ;
const int AX = 1e6 + 666 ;
char s[AX] ;
int a[AX] ;
int b[AX] ;
int res[AX] ;
int k , kb ;
int m , n ;
void add() {
int len = max( k , kb );
int c = 0 ;
for( int i = 1 ; i <= len ; i++ ) {
b[i] = b[i] + a[i] + c ;
c = b[i] / 10000 ;
b[i] %= 10000 ;
}
if( c ) b[++len] += c ;
kb = len ;
}
void mul( int num , int x ) {
for( int i = 1 ; i <= num ; i++ ) {
int c = 0 ;
for( int j = 1 ; j <= k ; j++ ) {
a[j] = a[j] * x + c ;
c = a[j] / 10000 ;
a[j] %= 10000 ;
}
if( c ) a[++k] = c ;
}
}
void m_to_ten( int len ) {
int base = 0 ;
kb = 1 ;
memset( b , 0 ,sizeof(b) );
for( int i = len - 1 ; i >= 0 ; i-- ) {
k = 1 ;
a[1] = 1 ;
int x ;
mul(base,m) ;
if( s[i] >= '0' && s[i] <= '9' ) x = (int)(s[i]-'0');
else {
if( s[i] >= 'a' && s[i] <= 'z' ) s[i] = s[i] - 'a' + 'A' ;
x = ( 10 + (int)(s[i]-'A') ) ;
}
mul(1,x);
add();
base ++ ;
}
}
int main() {
m = 16 ;
char tmp[1000] ;
while( ~scanf("%s",tmp) ) {
strcpy( s , tmp + 2 );
int len = strlen(s);
m_to_ten(len);
int f = 0 ;
for( int i = kb ; i >= 1; i-- ) {
if( i == k && !b[i] ) continue ;
if( f ) printf("%04d",b[i]);
else {
printf("%d",b[i]);
f = 1 ;
}
}
printf("\n");
}
return 0 ;
} #include <iostream>
using namespace std;
int main(){
long long n;
while(cin>>hex>>n){
cout<<dec<<n<<endl;
}
return 0;
} #include <stdio.h>
#include <string.h>
int main ()
{
unsigned char a[50];
while(scanf("%s",a)!=EOF)
{
char ans[50];
int len=strlen(a),c=0,p=0;
for(int i=2;i<len;)
{
c=0;
for(int j=i;j<len;j++)
{
if(a[j]>='A'&& a[j]<='F')a[j]=a[j]-'A'+10+c*16;
else a[j]=a[j]-'0'+c*16;
c=a[j]%10;
if((a[j]/10)>=10)a[j]=(a[j]/10)-10+'A';
else a[j]=(a[j]/10)+'0';
}
ans[p++]=c+'0';
while(a[i]=='0')i++;
}
for(int i=p-1;i>=0;i--)printf("%c",ans[i]);
printf("\n");
}
}
非常标准的进制转换了,注意一定要用unsigned char!!!在计算过程中用char保存整数的话会超过127,就溢出了!!当初找了好几个小时的原因。import string
import sys
change = {'A':10,'B':11,'C':12,'D':13,'E':14,'F':15}
while True:
str1 = sys.stdin.readline().strip('\n')[::-1]
if len(str1) == 0:
break
sum = 0
t = 1
for i in range(len(str1)):
if str1[i]=='x'or str1[i]=='X':
break
elif str1[i] >= '0' and str1[i] <='9':
sum = sum + int(str1[i])*t
t = t*16
continue
elif (str1[i] >= 'A' and str1[i] <= 'F') or (str1[i] >= 'a' and str1[i] <= 'f'):
sum = sum + change.get(str1[i])*t
t = t*16
continue
print(sum)
#include <stdio.h>
int main(void) {
int num = 0;
while (~scanf ("%x", &num))
printf("%d\n", num);
return 0;
}
#include <iostream>
#include <string.h>
using namespace std;
int main(){
char num[101];
while(gets(num)){
long ans=0,bit=1;
for(int i=strlen(num)-1;i>=2;i--){
if(num[i]>='A'&&num[i]<='F'){
ans+=(num[i]-'A'+10)*bit;
}else ans+=(num[i]-'0')*bit;
bit*=16;
}
cout<<ans<<endl;
}
return 0;
}
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[100];
int charToint(char a){
int result=0;
if(a=='0') result=0;
else if(a=='1') result=1;
else if(a=='2') result=2;
else if(a=='3') result=3;
else if(a=='4') result=4;
else if(a=='5') result=5;
else if(a=='6') result=6;
else if(a=='7') result=7;
else if(a=='8') result=8;
else if(a=='9') result=9;
else if(a=='A') result=10;
else if(a=='B') result=11;
else if(a=='C') result=12;
else if(a=='D') result=13;
else if(a=='E') result=14;
else if(a=='F') result=15;
return result;
}
int main()
{
while(~scanf("%s",&a)){
char *p=a+2;
int l=strlen(p);
int sum=0,mlt=1;
for(int i=l-1;i>=0;i--){
sum+=charToint(p[i])*mlt;
mlt*=16;
}
cout<<sum<<endl;
}
return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main(){
string str;
while(cin >> str){ //可能存在一个测试用例里有多组数据
int res = 0, remain = 0;
for(int i = 2; i < str.size(); ++i){ //从2开始,跳过0x
if(str[i]>='0' && str[i]<='9'){
remain = str[i] - '0';
}else{ //A~F
remain = str[i] - 'A' + 10;
}
res = res*16 + remain;
}
cout << res << endl;
}
return 0;
} import sys try: while True: number = sys.stdin.readline().strip() count = 0 number = number[2:] number = number[::-1] a = 0 for i in number: if i <= '9' and i >= '0': count += (ord(i) - ord('0')) * (16 ** a) elif i <= 'F' and i >= 'A': count += 16 ** a * (ord(i) - ord('A') + 10) elif i <= 'f' and i >= 'a': count += 16 ** a * (ord(i) - ord('a') + 10) a += 1 print str(count) except: pass
#include <iostream>
using namespace std;
int main() {
string str;
while(cin>>str){
int s=0;
int ans=0;
for(int i=2;i<str.size();i++){
if(str[i]>='A'&&str[i]<='Z')s=str[i]-'A'+10;
else s=str[i]-'0';
ans=ans*16+s;
}
cout<<ans<<endl;
}
}