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

c++进制问题

a1602388940 发布于 2020-03-09 11:08, 3389 次点击
编写程序:输入2个字符,分别在'1'-'9'和'A'-'F'之间,把这两个字符看作1个二位16进制整数的2个数位。输出这个数的10进制形式和16进制形式。运行程序,观察输入的字符和输出的16进制是否一致。
21 回复
#2
叶纤2020-03-09 14:09
十六进制不是必须要加0x的吗?
#3
a16023889402020-03-09 14:34
回复 2楼 叶纤
是的啊 这题该怎么操作呢
#4
rjsp2020-03-09 16:51
程序代码:
#include <iostream>
#include <iomanip>
#include <optional>
using namespace std;

std::optional<unsigned> h2u( char ch )
{
    if( ch < '0' )
        return {};
    if( ch <= '9' )
        return ch-'0';
    if( ch < 'A' )
        return {};
    if( ch <= 'F' )
        return ch-'A'+10;
    return {};
}

int main( void )
{
    char a,b;
    if( !(cin>>a>>b) )
        return 1;

    auto vh = h2u(a);
    auto vl = h2u(b);
    if( !vh.has_value() || !vl.has_value() )
        return 2;

    auto value = vh.value()*16 + vl.value();
    cout << value << '\t'
         << setfill('0') << setw(2) << setiosflags(ios::uppercase) << hex << value << endl;
}
#5
return_02020-03-09 19:12
转二进制:
程序代码:

#include<iostream>
using namespace std;
int main(){
    int i=0,n,a[100];
    cin>>n;
    while(n!=0){
        a[i]=n%2;
        i++;
        n/=2;
    }
    for(int j=i-1;j>=0;j--){
        cout<<a[j];
    }
    return 0;
}
#6
return_02020-03-09 19:17
十六进制:
程序代码:

#include<iostream>
using namespace std;
int main(){
    int i=0,n,m=16,a[100];
    cin>>n;
    while(n!=0){
        a[i]=n%m;
        n/=m;
        i++;

    }
    for(int j=i-1;j>=0;j--){
        if(a[j]>=10)
            cout<<(char)(a[j]-10+'A');
        else
            cout<<a[j];
    }
    return 0;
}
#7
叶纤2020-03-09 19:44
回复 6楼 return_0
给你个眼神自己体会呀,如果这一题只是简单的进制转换用hex和bitset就可以了,关键是要输入的是字符字符呀,哥哥,
#8
return_02020-03-09 19:48
???
#9
lin51616782020-03-09 23:22
scanf %x 输入
printf %d %x 输出
就可以了
#10
叶纤2020-03-10 05:40
程序代码:

这个问题想的我头都快要炸了

#include<iostream>
#include<string>
#include<bitset>
using namespace std;
int main()
//两个字符,输出10进制16进制
//字符转十进制-55,
//一位数字输出ch,一位字符输出10进制-55
//数字加字符=2+,数字变2进制,左移4位字符变2进制加数字2进制
//转换10进制(不可行)
//
{string a;cin>>a;int count{};int tem{};
int shi[2];int fg{};int i{};int bin1{};

 for(i=0;a[i];++i)
    { if(a[i]>='0'&&a[i]<='9')
    {++count;}
     else if(a[i]>='A' && a[i]<='Z')
     {++tem;}
     }
     fg=count+tem;//输入字符数字和字母的位数
     
//cout<<fg;
    if((fg==1)&&(a[0]>='0'&&a[0]<='9'))
     {cout<<a[0];cout<<endl;cout<<"十六进制"<<a;//一位且是数字打印字符
     }
     else if((fg==1)&&(a[0]>='A' && a[0]<='Z'))
    { cout<<static_cast<int>(a[0])-55;
    cout<<endl;
      cout<<"十六进制"<<a;//一位且是字母打印字字母二进制
    }
     else
       {//2位的情况
           
           if(tem==1){int x= static_cast<int>(a[0])-48;     
     int y= static_cast<int>(a[1])-55;
     
    cout<<x*16+y;
     
      cout<<endl;//字母有一个,第一个减48减55数字字母变10进制,推导出十六进制总是a【0】*16+a[1]
      cout<<"十六进制"<<a;}
      if(tem==2)
      //字母2位的情况同上
      {int x= static_cast<int>(a[0])-55;     
     int y= static_cast<int>(a[1])-55;
          cout<<x*16+y;
      cout<<endl;
      cout<<"十六进制"<<a;}
      }
      

 }


#11
a16023889402020-03-10 13:15
回复 10楼 叶纤
大佬大佬
#12
a16023889402020-03-10 13:18
回复 4楼 rjsp
#13
叶纤2020-03-10 13:27
回复 12楼 a1602388940
2楼才是大佬,我只是列出了所有可能性,不过输出16进制的时候我取巧了,这样容易造成bug,其实应该把十进制直接转16进制比较好,而不是打印输入字符
#14
return_02020-03-10 13:29
用我的任意进制代码借鉴一下:
程序代码:

#include<iostream>
using namespace std;
int main(){
    int i=0,n,m,a[100];
    cin>>n>>m;
    while(n!=0){
        a[i]=n%m;
        n/=m;
        i++;

    }
    for(int j=i-1;j>=0;j--){
        if(a[j]>=10)
            cout<<(char)(a[j]-10+'A');
        else
            cout<<a[j];
    }
    return 0;
}
#15
return_02020-03-10 13:36
程序代码:

#include<iostream>
#include<string>
using namespace std;
int main(){
    string s;
    int m=16;
    cin>>s;
    string temp1=s;
    int len=s.length();
    int weight = 1, asw = 0;
    for(int i=len-1;i>=0;i--){
        if(s[i]<='9')
            asw=asw+(s[i]-'0')*weight;
        else
            asw=asw+(s[i]-'A'+10)*weight;
        weight*=m;
    }
    cout<<asw<<" ";
    for(int i=0;i<len;i++){
        cout<<s[i];
    }
    return 0;
}

这是我绞劲脑汁帮你写的代码
如果你想让其他进制转十进制的话,改m的值即可
#16
叶纤2020-03-10 13:37
回复 14楼 return_0
input:输入两位字符表示16进制(0_9!A_Z):FF
output:255              十六进制FF
(输出10进制和16进制)
//要不你再重新做一遍
#17
return_02020-03-10 13:39
我输出了呀
我发图
#18
return_02020-03-10 13:42
只有本站会员才能查看附件,请 登录


#19
叶纤2020-03-10 13:53
为什么可以直接字母减数字啊asw=asw+(s[i]-'A'+10)*weight;
#20
叶纤2020-03-10 14:15
不用回答了,懂了,如果是单个字母那就是字母形态
如果和整形类型进行运算,就会进行隐式转换,char的优先级低于int,所以char升级为int,这样输出形态就是int型
#21
return_02020-03-10 14:55
我的还支持多位16进制
#22
叶纤2020-04-08 19:59
程序代码:

10楼代码少个条件,补充一下
虽然代码很糟糕,但也不能给别人缺胳膊少腿的代码
#include<iostream>
#include<string>
#include<bitset>
using namespace std;
int main()
//两个字符,输出10进制16进制
//字符转十进制-55,
//一位数字输出ch,一位字符输出10进制-55
//数字加字符=2+,数字变2进制,左移4位字符变2进制加数字2进制
//转换10进制(不可行)
//
{string a;cin>>a;int count{};int tem{};
int shi[2];int fg{};int i{};int bin1{};

 for(i=0;a[i];++i)
    { if(a[i]>='0'&&a[i]<='9')
    {++count;}
     else if(a[i]>='A' && a[i]<='Z')
     {++tem;}
     }
     fg=count+tem;//输入字符数字和字母的位数
     
//cout<<fg;
    if((fg==1)&&(a[0]>='0'&&a[0]<='9'))
     {cout<<a[0];cout<<endl;cout<<"十六进制"<<a;//一位且是数字打印字符
     }
     else if((fg==1)&&(a[0]>='A' && a[0]<='Z'))
    {cout<<static_cast<int>(a[0])-55;
    cout<<endl;
      cout<<"十六进制"<<a;//一位且是字母打印字字母二进制
    }
     else
       {//2位的情况
           
           if(tem==1){int x= static_cast<int>(a[0])-48;     
     int y= static_cast<int>(a[1])-55;
     
   cout<<x*16+y;
     
      cout<<endl;//字母有一个,第一个减48减55数字字母变10进制,推导出十六进制总是a【0】*16+a[1]
      cout<<"十六进制"<<a;}
      if(tem==2)
      //字母2位的情况同上
      {int x= static_cast<int>(a[0])-55;     
     int y= static_cast<int>(a[1])-55;
          cout<<x*16+y;
      cout<<endl;
      cout<<"十六进制"<<a;}
      if(count==2)
      {  int x=static_cast<int>( a[0])-48;
          int y=static_cast<int>(a[1])-48;
         cout<<x*16+y;
         cout<<endl;
         cout<<"十六进制"<<a;
          }
      
      }
      


 }


1