注册 登录
编程论坛 C语言论坛

C语言进制转换

邹峰研 发布于 2020-04-08 17:42, 2760 次点击

键盘输入任一个大于等于0的整数,输出R进制表示的字符串
【样例输入1】
  29 2  
【样例输出1】
  11101
【样例输入】
  29 16  
【样例输出】
  1D

-----------------------------------我写出来的代码运行结果总是方块, ,有没有人知道原因啊?----------------------------------------

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i,count=0,n,m,shang=1;
    char A[1000],yu;
    scanf("%d %d",&n,&m);
    while(n)
    {
        shang = n;
        n = n/m;
        yu = shang%m;
        if(yu>9 && yu<16)
            yu = yu-10+'A';
        A[count++] = yu;
    }
    A[count+1] = '\0';
    for(i=count-1;i>=0;i--)
        printf("%c",A[i]);

    return 0;
}
10 回复
#2
lin51616782020-04-08 17:52
        if(yu>9 && yu<16)
            yu = yu-10+'A';
大于9 有处理
小于9 怎么办?
#3
lin51616782020-04-08 17:58
程序代码:
#include <stdio.h>

void foo(int n, int base)
{
    if(n)
    {
        foo(n/base, base);
        putchar("0123456789ABCDEF"[n%base]);
    }
}

int main(int argc, char *argv[])
{
    int n, m;
    scanf("%d%d", &n, &m);
    foo(n, m);
    puts("");
    return 0;
}
#4
飞天大烧卖2020-04-08 18:29
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i,count=0,n,m;
    int A[1000],yu;
    scanf("%d %d",&n,&m);
    while(n)
    {
        yu = n%m;
        n = n/m;
        A[count++] = yu;
    }
       for(i=count-1;i>=0;i--)
        printf("%d",A[i]);
        return 0;
}
#5
邹峰研2020-04-08 18:44
回复 2楼 lin5161678
小于9的话 就直接加入A呀
#6
lin51616782020-04-08 18:50
以下是引用邹峰研在2020-4-8 18:44:48的发言:

小于9的话 就直接加入A呀

直接加入就错了呗
你得 + '0'
#7
lin51616782020-04-08 18:52
回复 4楼 飞天大烧卖
这段代码无法处理 超过十进制的情况
比如样例里面的
29 16
#8
飞天大烧卖2020-04-08 20:15
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i,count=0,n,m;
    int A[1000],yu;
    char b[1000];
    scanf("%d %d",&n,&m);
    if(m<=10)//加判断来处理16进制数据
    {
    while(n)
    {
        yu = n%m;//取余数
        n = n/m;//取商
        A[count++] = yu;//存到数组里
    }
       for(i=count-1;i>=0;i--)//遍历数组
        printf("%d",A[i]);
        return 0;
    }
    else
    {
        while(n)
        {
        yu=n%m;
        n=n/m;
        if(yu>=10)
        b[count++]=yu+55;
        else
        b[count++]=yu+48;
        }
         for(i=count-1;i>=0;i--)//遍历数组
          printf("%c",b[i]);
          return 0;
    }
}

#9
自学的数学2020-04-08 21:09
程序代码:
#include<iostream>   
#include<math.h>   
#include<string.h>  
using namespace std;   
int main()   

{  char q[100];  
   long n=0;
   int i,l,r=0,p,c,m=0,s[100];  

   cout<<"输入要转化的数:"<<endl;  
   cin>>q;  
   cout<<"输入原数进制:"<<endl;  
   cin>>i;  
   cout<<"转换后的进制:"<<endl;  
   cin>>p;  
   l=strlen(q);  
   strupr(q);
   for(l=l-1;l>=0;l--)  
      {if(q[l]<='9')n=n+(q[l]-48)*pow(i,r++);  
          else n=n+(q[l]-55)*pow(i,r++);}  

   while(n!=0)
   {  c=n%p;   
      n=n/p;   
      m++;  
      s[m]=c;   
   for(int k=m;k>=1;k--)
      {   
         if(s[k]>=10)   
            cout<<(char)(s[k]+55);   
         else        
            cout<<s[k];  
      }   
   cout<<endl;  
   return 0;
   }
}
#10
邹峰研2020-04-08 21:36

我也补写了一个,算是提供思路吧,谢谢各位了!

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i,x,count=0,n,m,shang=1;
    char A[1000],yu,B[]={'A','B','C','D','E','F','\0'};

    scanf("%d %d",&n,&m);
    if(n==0)
    {
        printf("%d",n);
        return 0;
    }
    else
    {
        while(n)
        {
            shang = n;
            n = n/m;
            yu = shang%m;
            if(yu>9 && yu<16)
                yu = yu-10+'A';
            A[count++] = yu;
        }
        A[count+1] = '\0';
        for(i=count-1;i>=0;i--)
        {
            if(A[i]-65>=0)
            {
                x = A[i]-65;
                printf("%c",B[x]);
            }
            else
                printf("%d",A[i]);
        }
    }


    return 0;
}
#11
邹峰研2020-04-10 12:21
回复
1