写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串(注意可能存在的一个测试用例里的多组数据)。
#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; } }