输出202、117、70、130的十进制、八进制、十六进制数据形式,结果为0ddddd或0Xddddd。
输入格式:
无
输出格式:
输出为整型,空格分隔。每个数的输出占一行。
输入:
无
输出:
202 0312 0XCA 117 0165 0X75 70 0106 0X46 130 0202 0X82
我滴天呐,不看解析不知道,一看吓一跳,原来有专门输出的格式符,我还直接按照计算八进制和十六进制的方法来算的,算到十六进制出错了,我才去看解析。我采用的方法就是最基本的十进制化八进制和十进制化十六进制的方法。
十进制化八进制方法:
1.间接法:用二进制作为桥梁,先将十进制转换成二进制,然后将二进制又转换成八进制 。
2.直接法:采用除8取余法,即每次将整数部分除以8,余数为该位权上的数,而商继续除以8,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数起,一直到最前面的一个余数。
所以我的解决方法就是,首先输入十进制数,使用这个数依次除以8(即第一次使用所给数除以8,将余数存到一个数组里面,然后使用商除以8,得到余数在存放到数组里),等商为0之后,倒序输出该数组。
十六进制的解决过程和八进制类似,但是对于十六进制数,还有10用A表示,11用B表示这个说法,所以我就使用了一个switch case语句,除了这几个特殊的数值,其余的就直接按照所得到小于10的数输出。在实现的过程中,因为输入的数是十进制数,所以我刚开始设置的数组是整型数组,但是,在十六进制中,要用A,B等字符表示,所以我就又定义了一个字符串型数组,最后输出的都为字符型(对于小于10的整数,转换成字符型我直接使用+'0'这个方法。)
注意:整型转换为字符型可以直接加字符0。
即 整型 + '0' =字符型
字符型 - '0' = 整型
但是在输出字符型%s时,程序会报错,error: cannot pass objects of non-trivially-copyable type ‘std::string’问题
解决办法:在字符格式化输出对应位置的变量后加.c_str();
例:我要输出的是字符串数组对应的值,就将c[j]修改为c[j].c_str(),即
printf("%s",c[j].c_str());
至于原因,我查了一下:printf 当发现一个%s 时候,会把后面可变参数中相应的项当作char* 来处理,而string是stl的类型,不符合他的要求,所以调用c_str转为char*。
更多详细的内容,可以自行进行查阅。
#include
using namespace std;
void OCT(int a){
int b[5];
int i;
for(i = 0;i<=3;i++){
b[i] = a%8;
// printf("b[%d]=%d ^",i,b[i]);
a = a/8;
// printf("a=%d#\n",a);
if(a==0){
b[i+1]=0;
// printf("b[%d]=%d",i+1,b[i+1]);
}
}
for(int j=3;j>=0;j--){
printf("%d",b[j]);
}
printf(" ");
}
void HEX(int a){
printf("0X");
int b[5];
string c[5];
int i;
for(i = 0;a%16 != 0;i++){
b[i] = a%16;
// printf("%d ",b[i]);
a = a/16;
switch(b[i])
{
case 10:c[i]='A';break;
case 11:c[i]='B';break;
case 12:c[i]='C';break;
case 13:c[i]='D';break;
default:c[i]=b[i] + '0';break;
}
}
for(int j=3;j>=0;j--){
printf("%s",c[j].c_str());
}
printf(" ");
}
int main( )
{
int a = 202,b = 117,c = 70,d = 130;
printf("%d ",a);
OCT(a);
HEX(a);
printf("\n");
printf("%d ",b);
OCT(b);
HEX(b);
printf("\n");
printf("%d ",c);
OCT(c);
HEX(c);
printf("\n");
printf("%d ",d);
OCT(d);
HEX(d);
printf("\n");
return 0;
}
很复杂是吧,我也觉得,这个代码成功通过了码题集的测试,所以这个代码的基本思路是正确的,但是如果测试用例过多的话,有可能会出错。下面是采用直接输出的办法解决的代码:
#include
using namespace std;
int main(){
int a = 202,b = 117,c = 70,d = 130;
printf("%d %#o %#X\n",a,a,a);
printf("%d %#o %#X\n",b,b,b);
printf("%d %#o %#X\n",c,c,c);
printf("%d %#o %#X\n",d,d,d);
}
记住了相应的格式化输出符号确实省事,这就五句话直接解决了我用了那么长时间写的代码,对于基础薄弱的我来说,我自己写的代码就当是复习十进制转八进制和十六进制的内容了,也不亏。
%o:八进制数形式输出整数,
%x:十六进制数形式输出整数,
%u:十进制数输出unsigned型数据(无符号数)。
若是在前面加#,就表示带有前缀,即八进制数前加0;十六进制数前加0X或0x
常见进制前后缀:
常见进制前后缀 进制数 前缀 后缀 二进制 0b或0B b/B 八进制 0 o/O 十进制 无,但可加 + - d/D 十六进制 0x或0X h/H
编写一个程序,要求输入一个两位数的数字,然后逆序输出数字。不考虑不合理的输入或是溢出等特殊情况。
输入格式:
输入正整数
输出格式:
输出为逆序后的字符串
输入:
28
输出:
82
#include
using namespace std;
int main( )
{
int a;
cin >> a;
int count = 0;
int b = a;
//首先查看输入数的位数
while(b != 0){
b/=10;
count++;
// printf("%d",count);
}
//再求余数,直接输出就是倒序的
while(count != 0){
cout << a%10;
a/=10;
count--;
}
return 0;
}
这个题目并不难,但是需要注意的是,在计算输入的数的位数的时候,需要将输入值赋给另外的变量,否则,在计算位数时就把输入值a变为0了,后面无论如何输出都只能是0。
输入为整数x,y,求x、y之和的立方。不考虑溢出等特殊情况。
输入格式:
输入为整型,空格分隔
输出格式:
输出为整型
输入:
1 3
输出:
64
#include
using namespace std;
int main( )
{
int a,b;
cin >> a >> b;
int c = a + b;
cout << pow(c,3) ;
return 0;
}
原本以为,求两个数的和的立方只需要调用pow()函数即可,但是却有一个用例过不去
这是因为pow()函数输出的值默认为浮点型,但是题目要求的为整型,所以直接输出会出错。解决办法就是,将pow()函数的值赋给一个整型变量。
注意:pow()函数输出的值默认为浮点型
#include
using namespace std;
int main( )
{
int a,b;
cin >> a >> b;
int c = a + b;
int d = pow(c,3);
cout << d ;
return 0;
}
所以,在写代码的时候,还是尽量将输出的值赋给一个新的变量,然后将这个变量输出,这样,可能会避免一些不必要的错误。
输入数字a并计算a的绝对值。不考虑不合理的输入或是溢出等特殊情况。
输入格式:
输入实型数字a
输出格式:
输出a的绝对值,输出为实型
输入:
-5.1
输出:
5.100000
#include
using namespace std;
int main( )
{
double a;
scanf("%lf",&a);
// cin >> a;
double b = abs(a);
printf("%.6f",b);
return 0;
}
基本输入输出终于刷完了。
明天继续吧。