今天做啦一个进制转换的题,改来改去最终倒是过啦,本来挺开心的,然后去翻啦一下题解,瞬间就有小情绪啦,哎,人家的代码辣么辣么短,实在是不开心,不过谁让咱是小渣渣呢,在此总结一下strtol 函数。
先来看看把我整不开心的这道题
Hrbust1896 http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1896
题目简单,只要足够细心就能AC的
看我自己的代码
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 #include<stack> 6 #include<math.h> 7 using namespace std; 8 int main() 9 { 10 11 12 int n,m; 13 char s[20]; 14 while(~scanf("%d%s",&n,&s)){ 15 int t=0;int ss[50]; 16 int len=strlen(s); 17 for(int i=0;i<len;i++){ 18 if(s[i]=='a'||s[i]=='A')ss[t++]=10; 19 else if(s[i]=='b'||s[i]=='B')ss[t++]=11; 20 else if(s[i]=='c'||s[i]=='C')ss[t++]=12; 21 else if(s[i]=='d'||s[i]=='D')ss[t++]=13; 22 else if(s[i]=='e'||s[i]=='E')ss[t++]=14; 23 else if(s[i]=='f'||s[i]=='F')ss[t++]=15; 24 else {ss[t++]=s[i]-'0'; 25 26 } 27 28 } 29 30 int sum=0;int j=0; 31 for(int i=t-1;i>=0;i--){ 32 sum+=ss[i]*pow(n,j++); 33 } 34 35 cout<<sum<<endl; 36 37 38 } 39 }
至于我发现的很牛很短的代码是这个样子的
1 #include <stdio.h> 2 #include <iostream> 3 #include <string.h> 4 #include <math.h> 5 #include <stdlib.h> 6 using namespace std; 7 int main() 8 { 9 int m;//base(代表进制) 10 char n[100];//char*nptr 11 while(~scanf("%d %s",&m,&n)) 12 { 13 printf("%d ",strtol(n,NULL,m)); 14 //必须设定endptr为NULL 否则返回非法字符串 15 } 16 }
里面的注释是大神打上去的。。。
嘎嘎嘎,罪魁祸首就是strtol这个函数,不过他真的太方便啦嘿嘿
long int strtol(const char *nptr, char **endptr, int base)
*nptr指向的是在不同的进制下数的表示的字符串,base则为进制,char **endptr一般为空。