进制转换

6 篇文章 1 订阅

计算方法👇👇👇
二、八、十、十六进制之间的转换我学习的是这个博主的文章
进制转换大全

代码实现👇👇👇
参考了大佬的进制转换的模板:原文链接
X(string)–>10(int):用ans乘以x再从高位到低位加上字符串的每一位数字即可(若数位上是字母则减a加10)

int XToDec(string s,int x)   //将给定的x进制字符串s转换成10进制
{
    int ans = 0;
    for(int i = 0; i < s.length(); i++)
    {
        ans = ans*x + (isdigit(s[i]) ? s[i]-'0' : s[i]-'a'+10);
        /*等价于以下代码
        if(isdigit(s[i]))
        {
            ans = ans*x + (s[i]-'0');
        }
        else
        {
            ans = ans*x + (s[i]-'a'+10);
        }
        */
    }
    return ans;
}

10(int)–>X(string):判断n除以x的余数是否为个位数(0~9),若是个位数则直接加在结果字符串ans的右边,否则减10加a再与ans相加,循环以上操作直到n为0为止

string DecToX(int n,int x)    //将10进制的n转换成x进制字符串
{
    string ans="";
    do{
        int t = n%x;
        n /= x;
        ans += (t>=0&&t<=9) ? t+'0' : t-10+'a';
        /*等价于以下代码
        if(t >= 0 && t <= 9)
        {
            ans += (t+'0');
        }
        else
        {
            ans += (t-10+'a');
        }
        */
    }while(n != 0);   //以防输入为0的情况
    reverse(ans.begin(),ans.end());
    return ans; 
}

例题👇👇👇
一.蓝桥杯:
BASIC-10 十进制转十六进制 循环 整除 求余 判断 原题链接

#include<bits/stdc++.h>
using namespace std;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int n;
	cin >> n;
	string ans = "";
	do{
		int t = n%16;
		n /= 16;
		ans += (t>=0&&t<=9) ? t+'0' :t-10+'A';  //这个参考大佬的,发现大佬写的代码就是牛
		/*等价于👇
        if(t >= 0 && t <= 9)
        {
            ans += (t+'0');
        }
        else
        {
            ans += (t-10+'a');
        }
        */
	}while(n!=0);
	reverse(ans.begin(),ans.end());
	cout << ans ;
	return 0;	
} 

BASIC-11 十六进制转十进制 进制转换 字符处理 判断 原题链接
一个很秀的解法

#include<cstdio>
int main()
{
    long long n;
    scanf("%I64X",&n);//读入十六进制
    printf("%lld\n",n);
    return 0;
}

常规解法【注意】FFFFFFFF(十六进制) = 4294967295(十进制)

#include<bits/stdc++.h>
using namespace std;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	string s;
	cin >> s;
	long long ans = 0;
	for(int i=0;i<s.length();i++){
		ans = ans*16 + (isdigit(s[i]) ? s[i]-'0' :s[i]-'A'+10); 
		/*等价于👇
        if(isdigit(s[i]))
        {
            ans = ans*16 + (s[i]-'0');
        }
        else
        {
            ans = ans*16 + (s[i]-'a'+10);
        }
        */
	}
	cout << ans ;
	return 0;	
} 

BASIC-12 十六进制转八进制 进制转换 字符 循环 原题链接

小米OJ进制转换 原题链接

#include<bits/stdc++.h>
using namespace std;
int PtoD(string s,int P)  //p-->10
{
	int ans = 0;
	for(int i=0;i<s.length();i++){
		ans = ans*P +(isdigit(s[i])?s[i]-'0':s[i]-'a'+10); 
	}
	return ans;
}
string DtoQ(int n,int Q)  //10-->q
{
	string s = "";
	do{
		int t = n%Q;
		n /= Q;
		s += (t>=0&&t<=9)?t+'0':t-10+'a';
	}while(n);
	reverse(s.begin(),s.end());
	return s;
}
int main()
{
	int P,Q;
	string N;
	cin >> N >> P >> Q;
	cout << DtoQ(PtoD(N,P),Q);
}

HBU程序设计期末
十进制转二进制 题解链接
迭代实现

#include<bits/stdc++.h>
using namespace std;
void writebinary2(int n)
{
	int i = 0, bin[32];
	if (n == 0 || n == 1){
		bin[0] = n;
		i++;
	}
	while (n != 1 && n != 0){
		bin[i] = n % 2;
		i++;
		n = n / 2;
	}
	bin[i] = n;
	for (int j = i; j >= 0; j--)
		cout << bin[j];
}
int main()
{
	int n;
	cout << "Now, please enter a integer:\n";
	cin >> n;
	cout << "(decimal) " << n << " = (binary) ";
	writebinary2(n);
	cout << endl;
 
	return 0;
}

递归实现

#include <stdio.h>
void dectoBin(int n)
{
	if (n == 0||n == 1)
	{
		printf("%d",n);
	}
	else
	{
		dectoBin(n/2);
		printf("%d", n%2);
	}
}
int main(void)
{
	int n;
	printf("请输入一个正整数:");
	scanf("%d", &n);
	dectoBin(n);
	return 0;
}

额。。。百度到的迭代与递归的区别…
1、递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合。

2、迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B。

3、递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换.能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值