c++进制问题
编写程序:输入2个字符,分别在'1'-'9'和'A'-'F'之间,把这两个字符看作1个二位16进制整数的2个数位。输出这个数的10进制形式和16进制形式。运行程序,观察输入的字符和输出的16进制是否一致。
程序代码:#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;
}
程序代码:
这个问题想的我头都快要炸了
#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;}
}
}
