今天天着实有点小冷,只做了一些题目
基本上是水题,挑几道略微不常规的题来复盘吧
内容不多,不设目录了
16进制转10进制#include#include #include using namespace std; double power(int); string a; int main() { getline(cin,a); int len=a.length(); double sum=0; int temp; for(int i=len-1, k=0;i>=0;i--,k++) { switch(a[i]) { case '0': temp=0; break; case '1': temp=1; break; case '2': temp=2; break; case '3': temp=3; break; case '4': temp=4; break; case '5': temp=5; break; case '6': temp=6; break; case '7': temp=7; break; case '8': temp=8; break; case '9': temp=9; break; case 'A': temp=10; break; case 'B': temp=11; break; case 'C': temp=12; break; case 'D': temp=13; break; case 'E': temp=14; break; case 'F': temp=15; break; } sum+=temp*power(k); } printf("%.0lf",sum); return 0; } double power(int n) { double sum=1; for(int i=1;i<=n;i++) { sum*=16; } return sum; }
这类型题一个可能坑点就是计算幂指会超时 当然这题没有(在写这题的时候我想起来的)
一般来说自己写的pow函数会比自带的pow函数快,因为自带的可以计算浮点型的小数次方
而我们只需要求整数的就行了
01字串我的思路: 之前做过一个题(Y老师的小镇),求一个数的二进制直接
while(num)
{
cout<
这样 得到的是其二进制的倒序
只要将其存入数组在倒序输出5个就是答案了
#include
#include
#include
using namespace std;
int a[10];
int main()
{
for(int i=0;i<32;i++)
{
int temp=i;
int k=0;
while(temp)
{
a[k++]=temp%2;
temp/=2;
}
for(int j=4;j>=0;j--)
{
cout<
然后写完后去网上搜了搜
发现还有更优的解法(第二种)
根据题目直接取巧,实际上也是模拟手算 /2 再取余
16进制转8进制(100000位)
高精度的题目,始终是过不去的坎
尝试了将近一个小时,还是解决了(参考了)
结合之前的题目,自己写了一个16的pow函数计算10进制
再讲十进制num% 再*10扩位
最后取余输出(当没出现非零前 且取余为0时不输出0)
显示答案错误,应该是爆了或者超时了
以下是参考后的答案:
利用了字符串string的可加性
一个8进制数有3位二进制组成 所以保持3的倍数 不够就补前置0
把前三位拿出来 如果都是0不要加 不能输出
如果前三位是0 则后面加起来就算是0也直接变成字符串加进去了 结束->输出
为0的情况也能满足 进制转换真神奇
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int main()
{
int n;
int i, k;
cin >> n;
while(n--)
{
string op;
string sixteen;
string eight;
cin >> sixteen;
for ( i = 0; i < sixteen.length(); i++)
{
switch (sixteen[i])
{
case '0':
op += "0000";
break;
case '1':
op += "0001";
break;
case '2':
op += "0010";
break;
case '3':
op += "0011";
break;
case '4':
op += "0100";
break;
case '5':
op += "0101";
break;
case '6':
op += "0110";
break;
case '7':
op += "0111";
break;
case '8':
op += "1000";
break;
case '9':
op += "1001";
break;
case 'A':
op += "1010";
break;
case 'B':
op += "1011";
break;
case 'C':
op += "1100";
break;
case 'D':
op += "1101";
break;
case 'E':
op += "1110";
break;
case 'F':
op += "1111";
break;
}
}
if (op.length() % 3 == 1)
op = "00" + op;
if (op.length() % 3 == 2)
op = "0" + op;
if (op[0] !='0' || op[1] !='0' || op[2] != '0')
{
char temp;
temp = (op[0] - '0') * 4 + (op[1] - '0') * 2 + op[2];
eight += temp;
}
for ( i = 3; i < op.length(); i += 3)
{
eight += (op[i] - '0') * 4 + (op[i + 1] - '0') * 2 + op[i + 2];
}
cout << eight << endl;
}
return 0;
}
进制转换真神奇



