22.01.07总结

今天天着实有点小冷,只做了一些题目

基本上是水题,挑几道略微不常规的题来复盘吧

内容不多,不设目录了

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;
}

进制转换真神奇 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值