user-0 提问: 利用栈实现任意进制转换的一道题

回复:
user: user-1
content: 既然有ABCDEF，因此不能直接用整形，N可以采用 字符串，大致代码如下  #include<iostream> #include<string> #include <stack> #include<ctype.h> using namespace std; char strmask[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; int main() {     int P, Q;     string N;     cin >> P >> Q >> N;     int tmp=0;     size_t slen = N.length();     for(int i=0;i<N.length();i++)     {         char c = N[i];         if (isdigit(c)) {             tmp += (c-'0')*pow(P,slen-i-1);         }         else {             c = toupper(c);             tmp += ((c - 'A') + 10)*pow(P,slen-i-1);         }     }        stack<char> stresult;     while (tmp) {         int n = tmp % Q;         stresult.push(strmask[n]);         tmp = tmp / Q;     }     while (!stresult.empty()) {         cout << stresult.top();         stresult.pop();     }     cout << endl;     return 0; }

user: user-0
content: 引用 7 楼 真相重于对错 的回复:你的栈存放是int啊，所以输出要处理一下  嗷嗷我懂了！谢谢前辈！

user: user-1
content: 你的栈存放是int啊，所以输出要处理一下

user: user-0
content: 引用 5 楼 真相重于对错 的回复:你肯定不对，原题是： 给出一个 P 进制整数 N，求 N 的 Q 进制表示。 其中 0<= N <= 32767 , 2 <= P <= 16, 2 <= Q <= 16。 大于 9 的数字用 A、B、C、D、E、F 表示。 输入 P Q N（用 P 进制表示的） 因为P可能是大于10的进制，那么N就不能直接用int表示，而需要字符串，比如一个十三进制的A5。转换为8进制，你怎么接受N呢？  嗷嗷 前辈我把你的用stl的栈手写了下（因为我C++这块还不太熟悉 才刚学一直用C手写）但是我没还是查出来哪里错 #include<iostream> #include<math.h> #include<string.h> using namespace std;  typedef struct SNode{ 	int data; 	struct SNode *next; }SNode,*Stack; int InitStack(Stack &s){ 	s=NULL; 	return 0; } int Empty(Stack s){ 	return (s==NULL); } int Top(Stack s){ 	return(s->data); } int Push(Stack &s,int x){ 	Stack p; 	p=new SNode; 	p->data=x; 	 	p->next=s; 	s=p; 	return 0; } int Pop(Stack &s,int &x){ 	if(Empty(s)) return -1; 	Stack p=s; 	s=s->next; 	x=p->data; 	delete p; 	return x; } int main(){ 	char strmask[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; 	Stack s; 	InitStack(s); 	int P,Q; 	char N[32768]; 	int temp; 	scanf("%d %d",&P,&Q); 	scanf("%s",&N); 	int slen=strlen(N); 	for(int i=0;N[i]!='\0';i++){ 		char c=N[i]; 		if (isdigit(c)) {//判断是否是数字              temp += (c-'0')*pow(P,slen-i-1); //是数字          }         else {             c = toupper(c); //不是数字，转化为大写英文字母              temp += ((c - 'A') + 10)*pow(P,slen-i-1);         } 	} 	 	while(temp){ 		int n = temp % Q;         Push(s,strmask[n]);         temp = temp / Q; 	} 	while(!Empty(s)){ 		int x=0; 		x=Pop(s,x); 		printf("%d",x); 	} 	return 0; }

user: user-1
content: 你肯定不对，原题是： 给出一个 P 进制整数 N，求 N 的 Q 进制表示。 其中 0<= N <= 32767 , 2 <= P <= 16, 2 <= Q <= 16。 大于 9 的数字用 A、B、C、D、E、F 表示。 输入 P Q N（用 P 进制表示的） 因为P可能是大于10的进制，那么N就不能直接用int表示，而需要字符串，比如一个十三进制的A5。转换为8进制，你怎么接受N呢？

user: user-1
content: 13 8 4A5

user: user-0
content: 引用 2 楼 自信男孩 的回复:#include<iostream> #include<math.h>  using namespace std;  typedef struct SNode{     int data;     struct SNode *next; } SNode,*Stack; int InitStack(Stack &s){     s=NULL;     return 0; } int Empty(Stack s){     return (s==NULL); } int Top(Stack s){     return(s->data); } int Push(Stack &s,int x) {     Stack p;     p=new SNode;     p->data=x;      p->next=s;     s = p;      return 0; } int Pop(Stack &s,int &x) {     if(Empty(s)) return -1;     Stack p=s;     s=s->next;     x=p->data;     delete p;     return 1; }  int main() {     Stack s;     InitStack(s);     int N,P,Q;     int m=0,n=0;     scanf("%d %d %d",&P,&Q,&N);     if(P>Q){         while(N>0){             m=N%Q;             Push(s,m);             N=N/Q;         }         while(!Empty(s)){             Pop(s,n);             //printf("n = %d\n", n);             if (n >= 10) {                 printf("%c", n - 10 + 'A');             } else {                 printf("%d", n);             }         }     }      else if(P<Q){         int i=0,sum=0;         while(N>0){             m=N%10;             sum+=m*(pow(P,i));             i++;             N = N/10;         }          while(sum>0){             m=sum%Q;             Push(s, m);             sum = sum/Q;         }         while(!Empty(s)){             Pop(s,n);             //printf("n = %d\n", n);             if (n >= 10) {                 printf("%c", n - 10 + 'A');             } else {                 printf("%d", n);             }         }         printf("\n");     }      else if(P==Q){         printf("%d",N);     }      return 0; } 供参考～    if (n >= 10) {                 printf("%c", n - 10 + 'A');             } else {                 printf("%d", n);             } 判断一下pop的n是否大于10，然后根据输出的值做分支输出～ 前辈我试了下有几个example不能AC啊..是哪里的问题呢 这个是OJ的错误反馈  ========[test9.out]========= Expected						      |	Yours 111111111111110						      /	111  ============================== ========[test8.out]========= Expected						      |	Yours 32767							      /	7  ============================== ========[test4.out]========= Expected						      |	Yours 11111							      /	100101  ============================== ========[test5.out]========= Expected						      |	Yours ABC							      /	32767  ============================== ========[test6.out]========= Expected						      |	Yours 0							      |

user: user-2
content: #include<iostream> #include<math.h>  using namespace std;  typedef struct SNode{     int data;     struct SNode *next; } SNode,*Stack; int InitStack(Stack &s){     s=NULL;     return 0; } int Empty(Stack s){     return (s==NULL); } int Top(Stack s){     return(s->data); } int Push(Stack &s,int x) {     Stack p;     p=new SNode;     p->data=x;      p->next=s;     s = p;      return 0; } int Pop(Stack &s,int &x) {     if(Empty(s)) return -1;     Stack p=s;     s=s->next;     x=p->data;     delete p;     return 1; }  int main() {     Stack s;     InitStack(s);     int N,P,Q;     int m=0,n=0;     scanf("%d %d %d",&P,&Q,&N);     if(P>Q){         while(N>0){             m=N%Q;             Push(s,m);             N=N/Q;         }         while(!Empty(s)){             Pop(s,n);             //printf("n = %d\n", n);             if (n >= 10) {                 printf("%c", n - 10 + 'A');             } else {                 printf("%d", n);             }         }     }      else if(P<Q){         int i=0,sum=0;         while(N>0){             m=N%10;             sum+=m*(pow(P,i));             i++;             N = N/10;         }          while(sum>0){             m=sum%Q;             Push(s, m);             sum = sum/Q;         }         while(!Empty(s)){             Pop(s,n);             //printf("n = %d\n", n);             if (n >= 10) {                 printf("%c", n - 10 + 'A');             } else {                 printf("%d", n);             }         }         printf("\n");     }      else if(P==Q){         printf("%d",N);     }      return 0; } 供参考～    if (n >= 10) {                 printf("%c", n - 10 + 'A');             } else {                 printf("%d", n);             } 判断一下pop的n是否大于10，然后根据输出的值做分支输出～