进制转换问题
位转换
16转8
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//16转8 #include <stdio.h> #include <string.h> char str[100005], num; void Fun(int i, int state) //长度 位数 { int temp; if(i < 0) { if(num != 0) //此时的num转二进制后的有效位数小于三位,即num小于8 { printf("%d", num); } return; } if(state != 3) { temp = str[i] >= '0' && str[i] <= '9' ? str[i] - '0' : str[i] - 'A' + 10; temp <<= state; //state指每次将16进制转2进制后,截取最后三位后剩余几位 num |= temp; //把二进制的num和二进制的temp相加(等同于十进制之间的加,因为对应num位数的temp的后几位在上一步左移时填补了0) temp = num; num >>= 3; Fun(i - 1, state + 1); printf("%d", (temp & 1) + (temp & 2) + (temp & 4)); //相当于将temp转二进制后的最后三位取出并转8进制 } else { temp = num; num >>= 3; Fun(i, 0); printf("%d", (temp & 1) + (temp & 2) + (temp & 4)); } } int main() { int n; scanf("%d", &n); while(n--) { num = 0; scanf("%s", str); //输入 Fun((int)strlen(str) - 1, 0); printf("\n"); } return 0; }
10转2转16
View Code
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//十进制转2进制 转16进制 #include <stdio.h> #include <string.h> int inttoBin(unsigned int num) { int i; unsigned int mask = 0x80000000; for(i = 0; i < 32; i++) { if((num & mask) == mask) { printf("1"); } else { printf("0"); } num = num << 1; if((i + 1) % 4 ==0) { printf(" "); } } printf("\n"); } int inttoox(unsigned int num) { int i; unsigned int temp = num; char s[11]; memset(s,0,sizeof(char)); s[0] = '0'; s[1] = 'x'; s[10] = '\0'; unsigned int mask = 0x0000000f; for(i = 2; i < 10; i++) { if((temp & mask) > 10) { s[11-i] = (temp & mask) - 10 + 'a'; } else { s[11-i] = (temp & mask) + '0'; } temp = temp << 4; } printf("result = %s\n",s); //printf("result = %s\n",s); } int main() { unsigned int num; char s[11]; printf("intput a number\n"); scanf("%u",&num); inttoBin(num); inttoox(num); return 0; }
1.十进制转换成 d进制 <d<=16> 首选栈
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//十进制转换成d进制 用堆解决 #include<iostream> #include<stack> using namespace std; void gcd(int n,int d){ stack<int> s; int e; while(n!=0){ e=n%d; s.push(e); n/=d; } while(!s.empty()){ e=s.top(); s.pop(); cout<<e; } return ; } int main() { int num,d; while(cin>>num>>d){ gcd(num,d); } }
2.d进制转换成10进制 首选栈
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<stack> using namespace std; stack<int> s; int gcd(int d){ int e=1,sum,tmp=1; e=s.top(); s.pop(); sum=e; while(!s.empty()){ e=s.top(); s.pop(); tmp*=d; sum+=e*tmp; } return sum; } int main() { int d,e; string str; while(cin>>str>>d){ int len=str.length(); for (int i = s.size(); i > 0; --i) //自己清空栈 s.pop(); cout<<s.size()<<endl; for(int i=0;i<len;i++) { e=str[i]-'0'; s.push(e); } cout<<gcd(d)<<endl; } }
3. 大数转换 2 8 16进制转换(使用容器map) 待续,,,