10 solutions

  • 2
    @ 2022-1-2 21:09:26

    不明白递归在哪里,栈应该也不需要,大概是我的方法比较傻,大佬有更巧妙的办法。贴出来看看就行了,欢迎指正。

    #include<stdio.h>
    #include<stack>
    using namespace std;
    int n,m;
    int main(){
    	scanf("%d%d",&n,&m);
    	stack <char> s;
    	while(n!=0){
    		int h=n;
    		n / = m ;
    		h % = m ;
    		s.push(h);
    	}
    	while(!s.empty()){
    		if(s.top()<=9){
    			printf("%d",s.top());
    			s.pop();
    		}
    		else {
    			char t;
    			t='A'+s.top()-10;
    			printf("%c",t);
    			s.pop();
    		}
    	}
    	return 0;
    }
    
    • 1
      @ 2022-4-2 9:48:39

      两种方法 都供上了。递归 和 用栈。

      #include <iostream>
      #include <string>
      #include <stack>
      
      using namespace std;
      
      char charr[26] = { 'A','B','C','D','E','F','G','H','I','J'
      ,'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
      };
      
      void jinzhuan(int X,int M) {
      	if (X == 0) {
      		return;// 等于 0 进行返回
      	}
      	jinzhuan(X / M, M);
      	int temp = X % M;
      
      	if (temp < 10) {
      		cout << temp;
      	}
      	else {
      		cout << charr[temp - 10];
      	}
      	
      }
      
      
      
      int main(void) {
      	int X, M;
      	cin >> X >> M;
      	/*stack<int> s;
      
      	while (X != 0) {
      		s.push(X % M);
      		X /= M;
      	}
      	while (!s.empty()) {
      		int temp = s.top();
      		if (temp < 10) {
      			cout << temp;
      		}
      		else {
      			cout << charr[temp - 10];
      		} 
      		s.pop();
      	}*/
      	jinzhuan(X, M);
      
      	return 0;
      }
      
      • 1
        @ 2022-1-2 15:52:08

        用数组i来存储每次的余数,最后再遍历一次数组i若i大于等于了10再转化为相应的字母来表示

        #include<bits/stdc++.h>
        using namespace std;
        int a,b,l=0;
        int i[100000];
        char p[26];
        void pp(int a){
        	while(a>0){
        		i[l++]=a%b;
        		a-=a%b;
        		a/=b;
        	}
        }
        int main()
        {
        	cin>>a>>b;
        	pp(a);
        	for(int c=l-1;c>=0;c--){
        		if(i[c]>=10){
        			char b='A'+i[c]-10;
        			cout<<b;
        		}
        		else cout<<i[c];
        	}
        	return 0;
        }
        
        • 0
          @ 2022-1-2 22:59:09

          本人蒟蒻,各位大佬轻点喷

          #include<bits/stdc++.h>
          using namespace std;
          
          stack<int> s;
          char arr[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
          
          void dfs(int a,int b)
          {
          	if(a>b)
          	{
          		int num=a%b;
          		a=a/b;
          		s.push(arr[num]);
          		dfs(a,b);
          	}
          	else
          	{
          		s.push(arr[a]);
          	}
          }
          
          int main()
          {
          	int a,b;
          	cin>>a>>b;
          	dfs(a,b);
          	while(!s.empty())
          	{
          		char c;
          		c=s.top();
          		cout<<c;
          		s.pop();
          	}
          	return 0;
          }
          
          • 0
            @ 2022-1-2 21:47:05
            #include <bits/stdc++.h>
            using namespace std;
            typedef long long ll;
            int n,m,cnt;
            int a[105];
            char b;
            int main ()
            {
                cin>>n>>m;
                cnt=0;
                int k=n;
                while(k>0)
                {
                	a[cnt]=k%m;
                	k-=a[cnt];
                	k/=m;
                	cnt++;
            	}
            	for(int i=cnt-1;i>=0;--i)//倒序输出 
            	{
            		if(a[i]>=10)
            		{
            			b='A'+a[i]-10;
            			cout<<b;
            		}
            		else
            		{
            			cout<<a[i];
            		}
            	}
                return 0;
            }
            
            • 0
              @ 2022-1-2 16:52:00

              需要注意的一点就是要反过来输出

              #include<bits/stdc++.h>
              typedef long long ll;
              using namespace std;
              char a[100010];
              void printff(int u)
              {
              	if(u>=10) printf("%c",u-10+'A');
              	else cout<<u;
              }
              int main()
              {
              	int n,m,cnt=0;
              	cin>>n>>m;
              	int k=n;
              	while(k>0)
              	{
              		a[cnt++]=k%m;
              		k-=k%m; 
              		k/=m; 
              	}
              	for(int i=cnt-1;i>=0;i--)
              	{
              		printff(a[i]);
              	}
              	
              	return 0;
              }
              
              • 0
                @ 2022-1-2 16:38:37

                这道题的关键在于,将待转换数不断向所求进制取余,直到待转换数为0;再将余数与9比较,比9大的从‘A’开始加,比9小的直接输出

                #include<stdio.h>
                #include<stack>
                #include <vector>
                #include<iostream>
                #include<string.h>
                using namespace std;
                int main()
                {
                	int n,m;
                	scanf("%d %d",&n,&m);
                	stack<int> v;
                	while(n!=0){
                		v.push(n%m);
                		n/=m;
                	}
                	while(v.size()!=0){
                		if(v.top()<=9){
                		printf("%d",v.top());
                		v.pop();
                	}
                	else{
                		char s='A'+v.top()-10;
                		printf("%c",s); 
                		v.pop();
                	}
                	}
                	return 0;
                }
                
                • 0
                  @ 2022-1-2 15:43:15

                  主要思想是递归进位入栈

                  #include<bits/stdc++.h>
                  using namespace std;
                  int n,m,ans[105];
                  stack<char> num;//开全局 
                  char cnt[45]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//记录36个字符 
                  void turn(int x,int y)//递归进位入栈 
                  {
                  	int u=x/y;
                  	if(u>=y){//判断是否大于y 
                  		turn(u,y);
                  		num.push(u%y);//余数在递归出来之后入栈 
                  	}
                  	else if(u<y&&u>0)
                  		num.push(u);
                  	else
                  		return;
                  }
                  int main()
                  {
                  	std::ios::sync_with_stdio(false);
                  	cin>>n>>m;
                  	if(n==0)//先判断n 
                  		cout<<n;
                  	else{
                  		turn(n,m);
                  		if(n%m!=0)//递归结束后将最外面的那个余数入栈 
                  			num.push(n%m);
                  		int j=num.size();
                  		for(int i=j;i>=1;i--){//出栈入数组 
                  			ans[i]=num.top();
                  			num.pop();
                  		}
                  		for(int i=1;i<=j;i++)//输出 
                  			cout<<cnt[ans[i]];//是哪个数字就输出相应的字符 
                  	}
                  	return 0;
                  }
                  
                  • 0
                    @ 2022-1-1 23:44:03
                    #include<bits/stdc++.h>
                    using namespace std;
                    char b[100000];
                    int num=0;
                    char a[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
                    int ss(int n,int k){
                    	if(n==0){//判断结束条件
                    		return 0;
                    	}
                    	else{
                    		if(n%k>9){//正向存入
                    			b[num]=n%k-10+'A';//注意-10和+'A'
                    		}
                    		else{
                    			b[num]=n%k+'0';//注意+'0'否则输出会有方框
                    		}
                    		num++;
                    		return ss(n/k,k);
                    	}
                    }
                    int main(){
                    	int n;
                    	int k;
                    	cin>>n>>k;
                    	ss(n,k);
                    	for(int i=num-1;i>=0;i--){//反向输出
                    		cout<<b[i];
                    	}
                    	return 0;
                    }
                    
                    • 0
                      @ 2022-1-1 21:29:10

                      我这里转进制就是先不断取余,当小于要转的进制数时,再进行回溯输出即可

                      写得一般,仅供参考

                      #include <bits/stdc++.h>
                      using namespace std;
                      int n,m;
                      void ff(int x){//这样输出更方便
                      	if(x>9) printf("%c",x-10+'A');
                      	else printf("%d",x);
                      }
                      void dfs(int now){
                      	if(now<m){//小于要转的进制数则直接输出
                      		ff(now);
                      		return ;//递归结束,开始回溯
                      	}
                      	int k=now%m;//先取余再递归,再输出,从而保证输出是从递归结束时开始进行输出,从而倒着输出
                      	dfs(now/m);//递归
                      	ff(k);//输出
                      }
                      int main(){
                      	cin>>n>>m;
                      	dfs(n);
                      	return 0;
                      }
                      • 1

                      Information

                      ID
                      288
                      Time
                      1000ms
                      Memory
                      128MiB
                      Difficulty
                      4
                      Tags
                      # Submissions
                      116
                      Accepted
                      54
                      Uploaded By