8 条题解

  • 5
    @ 2022-8-30 21:34:44

    好久没有做题啦~今天上来就是一道进制转换(看到最后有彩蛋)看了一下范围,是 18 位数,可以用 long long 形式来写,看看思路吧!

    1. 首先定义一个函数 calculate 函数来转换进制
    2. 然后一定一定要定义一个 char型数组来存储从 0开始到16在16进制中对应的数字,这样就可以用 num[数字]来查找啦~(索引刚刚好)
    3. 然后就是一次一次的耗 long long 型的 n,每一次都进行取余并且查找数字,并且将长度加一
    4. 最后万万不可忘记的是:要倒叙输出哦~

    好了,上代码吧~(AC代码,保准通行!)

    #include <bits/stdc++.h>
    using namespace std;
    char a[100000];
    void calculate(long long n, int k, int s)
    {
    	char num[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
    	while (n > 0)
    	{
    		a[s] = num[n % k];
    		n /= k;
    		s += 1;
    	}
    }
    int main()
    {
    	long long x;
    	memset(a, 0, sizeof(a));
    	cin >> x;
    	if (x == 0) cout << 0 << endl;
    	else
    	{
    		calculate(x, 16, 0);
    		int lena = strlen(a);
    		for (int i = lena - 1; i >= 0; i--) cout << a[i];
    	}
    	return 0;
    }
    

    啥?你居然还在?看来你是铁粉,来看看彩蛋吧,但是这个转换进制的机制有几个条件请你务必要记住(否则,错了别来找我呀……)

    1. 务必要把数组 a 先全部都设为 0(数字的)
    2. 务必要确定是否可以用 long long 型来做,如果数字过大,那就不能用这个函数了

    最后来看看 calculate() 函数吧~~~~~~~

    void calculate(long long n, int k, int s)
    {
    	char num[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
    	while (n > 0)
    	{
    		a[s] = num[n % k];
    		n /= k;
    		s += 1;
    	}
    }
    
    • 4
      @ 2022-8-24 20:02:11

      有一个专门的函数用来完成十进制转十六进制。

      cout << setiosflags(ios::uppercase) << hex << n;`
      

      输入n,然后使用此函数即可。 当然,这种方法过于“懒人”,勤奋的同学还是参考其他题解为好。

      • 4
        @ 2022-8-19 23:01:55

        😄 一种字符串的写法如下: 十进制转R进制就是“除R取余法”(短除法),用来拆出10进制n的每一位。

        char a[7] = {0, 'A', 'B', 'C', 'D', 'E', 'F'}; 
        long long n, x;
        string s;
        char c;
        cin >> n;
        // 下面是通用的除 R倒着取余的过程
        while (n != 0)
        {
            x = n % 16;
            if (x + '0' <= '9')
            {
                c = x + '0';
            } 
        // 这里由于16进制的缘故多操作了一步
            else
            {
                c = x + 'A' - 10;
            }
            s = c + s;
            n = n / 16;
        }
        if (s == "")
        {
            cout << 0;
        }// 不要忘记判 0哦
        else
        {
            cout << s;
        }
        
        • 3
          @ 2023-7-29 11:02:41

          思路: 应为是16进制,出现字母,不能用常规做法,得换个思路; 首先因为出现字母,必须用char或string,这里我用char方便一点,我算了一下,可以开大于16的所有数,毕竟char只占一字节,开个50也没问题哈; 然后为了方便一些,何不用switch...case...default语句呢? 完整代码:(已AC)

          #include <bits/stdc++.h>
          using namespace std;
          int main(){
              long long n;
              int x=0,f;
              char c[50];
              cin>>n;
              if(n==0){
                  cout<<0<<endl;
                  return 0;
              }
              while(n>0){
                  f=n%16,n/=16;
                  switch(f){
                      case 10:c[++x]='A';break;
                      case 11:c[++x]='B';break;
                      case 12:c[++x]='C';break;
                      case 13:c[++x]='D';break;
                      case 14:c[++x]='E';break;
                      case 15:c[++x]='F';break;
                      default:c[++x]='0'+f;break;
                  }
              }
              for(int i=x;i>=1;i--)cout<<c[i];
              return 0;
          }
          

          格式化:

          #include <iostream>
          using namespace std;
          int main(){
              long long n;
              int x=0,f;
              char c[50];
              bool flag=true;
              cin>>n;
              while(n>0)
              {
                  f=n%16;
                  switch(f)
                  {
                      case 10:c[++x]='A';break;
                      case 11:c[++x]='B';break;
                      case 12:c[++x]='C';break;
                      case 13:c[++x]='D';break;
                      case 14:c[++x]='E';break;
                      case 15:c[++x]='F';break;
                      default:c[++x]='0'+f;break;
                  }
                  n/=16;
                  flag=false;
              }
              if(flag)
              {
                  cout<<0<endl;
              }
              else
              {
                  for(int i=x;i>=1;i--)
                  {
                      cout<<c[i];
                  }
              }
              return 0;
          }
          
          • 3
            @ 2023-2-1 13:59:34
            int long long n ,a[1000000],s=1;
                cin>>n;
                while(n>16)
                {
                    a[s]=n%16;
                    n/=16;
                    s++;
                }
                a[s]=n;
                for(int i=s;i>=1;i--)
                {
                    if(a[i]==10)  cout<<'A';
                    else if(a[i]==11)  cout<<'B';
                    else if(a[i]==12)  cout<<'C';
                    else if(a[i]==13)  cout<<'D';
                    else if(a[i]==14)  cout<<'E';
                    else if(a[i]==15)  cout<<'F';
                    else  cout<<a[i];
                }
            
            • 2
              @ 2024-4-5 10:02:13
              #include <iostream>
              using namespace std;
              char b[7]={'A','B','C','D','E','F'};
              int main()
              {
                  long long n;
                  int cnt=0,a[25];
                  cin >> n;
                  if (n==0)
                  {
                      cout << n;
                      return 0;
                  }
                  while(n>0)
                  {
                      a[++cnt]=n%16;
                      n/=16;
                  }
                  for (int i=cnt;i>0;i--)
                  {
                      if (a[i]>=10)
                      {
                          cout << b[a[i]-10];
                      }
                      else
                      {
                          cout << a[i];
                      }
                  }
                  return 0;
              }
              
              • 1
                @ 2023-1-18 21:22:47

                又来做题拉(最后有彩蛋~~) 1.定义一个num'1'~'F'

                2.把上一题的while循环ctrl+c ctrl+v过来(稍微改亿下)

                3.逆序输出

                重点来啦 先判断输入是否为0,如果是输出0 else循环输出(别问我是怎末知道的,说多了都是泪😕) 来康康代码

                char a[1000],num[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
                    if(n==0) cout<<0;
                    else{
                        while (n>0){
                            a[s]=num[n%16];
                            n/=16;
                            s++;
                        }
                        for(int j=s-1;j>=0;j--)
                            cout<<a[j];
                    }
                
                
                ---
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                彩蛋来咯
                附赠可直接复制代码//老师应该啥也么康见😄
                


                #include <bits/stdc++.h>
                using namespace std;
                int main(){
                    long long n,s=0;
                    cin>>n;
                    char a[1000],num[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
                    if(n==0) cout<<0;
                    else{
                        while (n>0){
                            a[s]=num[n%16];
                            n/=16;
                            s++;
                        }
                        for(int j=s-1;j>=0;j--)
                            cout<<a[j];
                    }
                    return 0;
                }
                

              • -6
                @ 2022-8-17 16:06:22

                如果你看了视频还不会我不知道你是什么情况

                数位拆分的时候把n%16保存到数组,然后倒着输出数组的元素即可。

                输出的时候如果a[i]>=10,输出对应的字母即可

                核心代码

                a[++cnt] = n % 16;
                n /= 16;
                for (int i = cnt; i >= 1; i--)
                {
                    if (a[i] >= 10)
                    {
                
                    }
                    else
                    {
                
                    }
                }
                
                • 1

                【入门】正整数n转换为16进制

                信息

                ID
                286
                时间
                1000ms
                内存
                16MiB
                难度
                6
                标签
                递交数
                786
                已通过
                216
                上传者