今天天着实有点小冷,只做了一些题目
基本上是水题,挑几道略微不常规的题来复盘吧
内容不多,不设目录了
16进制转10进制
#include<cstdio>
#include<iostream>
#include<algorithm>
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<<num%2;
num/=2;
}
这样 得到的是其二进制的倒序
只要将其存入数组在倒序输出5个就是答案了
#include<cstdio>
#include<iostream>
#include<algorithm>
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<<a[j];
}
cout<<endl;
}
return 0;
}
然后写完后去网上搜了搜
发现还有更优的解法(第二种)
根据题目直接取巧,实际上也是模拟手算 /2 再取余
16进制转8进制(100000位)
高精度的题目,始终是过不去的坎
尝试了将近一个小时,还是解决了(参考了)
结合之前的题目,自己写了一个16的pow函数计算10进制
再讲十进制num% 再*10扩位
最后取余输出(当没出现非零前 且取余为0时不输出0)
显示答案错误,应该是爆了或者超时了
以下是参考后的答案:
利用了字符串string的可加性
一个8进制数有3位二进制组成 所以保持3的倍数 不够就补前置0
把前三位拿出来 如果都是0不要加 不能输出
如果前三位是0 则后面加起来就算是0也直接变成字符串加进去了 结束->输出
为0的情况也能满足 进制转换真神奇
#include<iostream>
#include<functional>
#include<algorithm>
#include<string>
#include<string.h>
#include<cstdio>
#include<cstdlib>
#include<cmath>
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;
}
进制转换真神奇