任意进制的转换(C,C++)itoa函数,strtol函数,bitset函数,oct函数,dec函数,hex函数

十进制转换为(2-10)进制代码方法

#include<stdio.h>
int main()
{
	int a,b,count=0,i;
	scanf("%d%d",&a,&b);//a为需要转换的十进制数,b为需要转换成的进制数
	int arr[100];
	do
	{
		arr[count++]=a%b;   //举个例子比如说100转换为8进制
		                   //100%8=4,100/8=12,12%8=4,12/8=1;1%8=1,1/8=0;
						   //通过观察 1 4 4组成的144就是100转换为8进制后的数
						   //该算法建议在理解的基础上背诵它的转换方法 
		a=a/b;
	 } while(a!=0);
	 for(i=count-1;i>=0;i--)
	 {
	 	printf("%d",arr[i]);
	 }
 } 

 1173 十进制转换成n进制

输入要求:输入两个整数num和n,num表示要转换的数,n表示要转换成的进制。如10 2表示要求将十进制数10转换成二进制数。(2<=n<17)

输出要求:输出转化后的进制数,每个数字之后跟一空格,如果数字大于9,则输出大写英文字母(10-16分别对应A-F)。

输入样例   32685 13

输出样例   1 1 B 5 3 (注意看,输出每个数字间是有空格的,)

#include<stdio.h>
int main()
{
	int a,b,i,count=0;
	char arr[100];
	scanf("%d",&a);
	scanf("%d",&b);
	do{
		arr[count]=a%b;
		a=a/b;
		++count;
	}while(a!=0);
	
	for(i=count-1;i>=0;i--)
	{
		if(arr[i]>9)
		{
		printf("%c ",arr[i]-10+'A');//这里解释一下arr[]数组里存储的是ASCII,
		//比如说第一位arr[0]存储的是13这个数字对应的ASCII值,计算机内部存在自动转换, 
		//arr[i]-10+'A'通过这个操作可以实现(2-36)进制的转换 
		}
		else
		printf("%d ",arr[i]);
	}
	printf("\n");
}

任意(2-10)进制数转换为十进制

#include<stdio.h>
#include<math.h> 
int main()
{
	int arr[100],count=0,a,b,i,res=0;//res 是result结果的意思 
	scanf("%d%d",&a,&b);//a为需要转换为十进制的数,b为a的进制数
	        //举个例子 144 ,8进制的数想要转换为10进制 
			 //     观察发现 百位是1,十位是4,个位是4,1*8^2+4*8^1+4*4^0=144
			 //                                       百位   十位  个位             
	 do         
	{
		 arr[count++]=a%10;//用一个容器arr来存储a的末位上的数字 
		 a=a/10; 
	}while(a!=0);
	for(i=count-1;i>=0;i--)//逆序输出 
	{
		res=arr[i]*pow(b,i)+res;//这个是通过推导的具体数字总结的公式
		//这里调用函数pow要用头文件 #include<math.h> b指下面的数,i它对应的指数 
	}
   
    printf("%d",res); 
 } 

在C++中,可以直接调用函数进制转换

#include <iostream>
using namespace std;
int main()
{   cout << "35的8进制:" << oct << 35 << endl;  // 八进制octonary 使用方法是   <<____<<num    ____里面选择需要转换为八进制的oct ,num为需要被转换的数 
    cout << "35的10进制" << dec << 35 << endl;    //十进制decimalism           <<____<<num    ____里面选择需要转换为十进制的dec ,num为需要被转换的数
    cout << "35的16进制:" << hex << 35 << endl;   //十六进制hexadecimal        <<____<<num    ____里面选择需要转换为十六进制的hex,num为需要被转换的数 
}

此外,C++通过调用bitset函数将十进制数转换为二进制 

#include <iostream>
#include <bitset>
using namespace std;   //任意数转换为2进制1.
                       //定义:bitset< n > s;
                       //表示一个n位的二进制数,<>中填写位数;默认()中的数为十进制  
int main()
{   cout << "35的2进制(显示8位):" << bitset<8>(35) << endl;
    cout << "35的2进制(显示18位):" << bitset<18>(35) << endl;  //在<_>中,__横线上填写转换为二进制后需要显示的位数 ()内写需要被转换成二进制的数 
    cout << "35的2进制(显示3位):" << bitset<3>(35) << endl; //注意:在使用这个函数前需要调用头文件 #include <bitset>
}

 以下函数,_itoa函数能将任意十进制数转换为任意进制的数字

#include <iostream>
#include <algorithm>//需要调用这个头文件 
using namespace std;
int main()
{   

    // 将10进制数转换为任意的n进制数,结果为char型。
    int num = 233;
    char buffer[100]; //例如,将十进制的数字233转换为8进制的数字  351
     _itoa(num, buffer, 8);  //c++中一般用_itoa,用itoa也行,
     cout << buffer;
}

 以下这个函数是能将2至36进制字符串转换为10进制的函数(c++)strtol函数

#include <iostream>
#include <algorithm>//需要调用这个头文件 
using namespace std;   
int main()
{  
 // 
     char buffer[20]="10549stend#12";
    char *stop;
     int ans=strtol(buffer, NULL,8);//第一种写法,前面的buffer数组表示需要转换的字符串,传递数组的首地址
	  //后面的8表示需要将前面的字符串转换成的有效的八进制字符串,再将这个八进制的字符串转换为十进制的字符串,并返回该值 
    // strtol函数会将参数字符串根据参数base来转换成长整型数,参数base范围从2至36。
	 cout << ans << endl ; //这行输出的556是前面字符串识别到的1054(八进制),识别到9超出范围停止识别,
	 //再将已经识别的有效字符串转换为十进制结果是556
	 //中间为什么是NULL请看下面 
     
     //还是同样的数字,不过  NULL-->&stop  ,发生了变化,它的意思是把buffer这个字符串分成两部分,前面一部分有效识别的转换为十进制并返回该值
	 //后面的错误识别部分字符串存储到这个新的位置stop,记住格式,括号里面写&stop 
     int ans1=strtol(buffer, &stop,8);
     cout << ans1 << endl << stop;//此处再输出stop表示的是buffer中无效的字符串 ,ans1表示的是前面已经被识别并转换为十进制的字符串 
     //如果不想返回利用无效的字符串部分,写前面的NULL即可 
     //建议读者模仿学习这个格式 


}

以下文字转载别人的 

long int strtol(const char *nptr, char **endptr, int base)
strtol()会将nptr指向的字符串,根据参数base,按权转化为long int, 然后返回这个值。
参数base的范围为2~36,和0;它决定了字符串以被转换为整数的权值。
可以被转换的合法字符依据base而定,举例来说,当base为2时,合法字符为‘0’,‘1’;base为8时,合法字符为‘0’,‘1’,……‘7’;base为10时,合法字符为‘0’,‘1’,……‘9’;base 为16时,合法字符为‘0’,‘1’,……‘9’,‘a’,……‘f’;base为24时,合法字符为‘0’,……‘9’,‘a’,……‘n’,base为36时,合法字符为‘0’,……‘9’,‘a’,……‘z’;等等。其中,不区分大小写,比如,‘A’和‘a’会都会被转化为10。
当字符合法时,‘0’,……‘9’依次被转换为十进制的0~9,‘a’,……‘z’一次北转换为十进制的10~35。
strtol()函数检测到第一个非法字符时,立即停止检测,其后的所有字符都会被当作非法字符处理。合法字符串会被转换为long int, 作为函数的返回值。非法字符串,即从第一个非法字符的地址,被赋给*endptr。**endptr是个双重指针,即指针的指针。strtol()函数就是通过它改变*endptr的值,即把第一个非法字符的地址传给endptr。

多数情况下,endptr设置为NULL, 即不返回非法字符串。

建议打开看看这个博主的深入了解学习这个函数

我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《strtol()详解》, 一起来围观吧 https://blog.csdn.net/zxx2096/article/details/81127858?utm_source=app&app_version=4.21.0&code=app_1562916241&uLinkId=usr1mkqgl919blen

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值