只用于非负整数
#include<stdio.h>//上个程序是从十进制到任意进制的转换,这个程序是二进制(Binary)八进制(Octonary)十进制(Decimalism)十六进制(Hexadecimal)
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
void Binary_To_Decimalism(char base[])
{
int length = strlen(base);
//printf("%d\n",length);
int index;
long long decimalismtemp = 0;
for(index=0;index<length;index++)
{
decimalismtemp += (base[index]-'0')*(int)pow(2.0,length-1-index);
//printf("%d\n",(base[index]-'0')*(int)pow(2.0,length-1-index));
}
printf("%lld\n",decimalismtemp);
}
void Binary_To_Octonary(char base[])
{
int length = strlen(base);
int index;
long long decimalismtemp = 0;
for(index=0;index<length;index++)
{
decimalismtemp += (base[index]-'0')*(int)pow(2.0,length-1-index);
//printf("%d\n",(base[index]-'0')*(int)pow(2.0,length-1-index));
}
char Dec[40];
itoa(decimalismtemp,Dec,10);
Decimalism_To_Octonary(Dec);
}
void Binary_To_Hexadecimal(char base[])
{
int length = strlen(base);
int index;
long long decimalismtemp = 0;
for(index=0;index<length;index++)
{
decimalismtemp += (base[index]-'0')*(int)pow(2.0,length-1-index);
//printf("%d\n",(base[index]-'0')*(int)pow(2.0,length-1-index));
}
char Dec[40];
itoa(decimalismtemp,Dec,10);
Decimalism_To_Hexadecimal(Dec);
}
void Decimalism_To_Binary(char base[])
{
int length = strlen(base),index=0;
char Bin[40];
long long DecimalismNumber = atoi(base),divide,remainder;
//printf("%lld\n",DecimalismNumber);
/*divide = DecimalismNumber;
while(divide>0)
{
remainder = divide%2;
Bin[index++] = remainder+'0';
divide/=2;
}
Bin[index]='\0';
printf("%s\n",Bin);
strcpy(base,Bin);
length = strlen(Bin);
for(index=0;index<length;index++)Bin[index]=base[length-index];*/
itoa(DecimalismNumber,Bin,2);
printf("%s\n",Bin);
}
void Decimalism_To_Octonary(char base[])
{
int length = strlen(base);
char Oct[40];
long long DecimalismNumber = atoi(base);
//printf("%lld\n",DecimalismNumber);
itoa(DecimalismNumber,Oct,8);
printf("%s\n",Oct);
}
void Decimalism_To_Hexadecimal(char base[])
{
int length = strlen(base);
char Hex[40];
long long DecimalismNumber = atoi(base);
itoa(DecimalismNumber,Hex,16);
printf("%s\n",Hex);
}
void Octonary_To_Binary(char base[])
{
int length = strlen(base);
int index;
long long decimalismtemp = 0;
for(index=0;index<length;index++)
{
decimalismtemp += (base[index]-'0')*(int)pow(8.0,length-1-index);
//printf("%d\n",(base[index]-'0')*(int)pow(8.0,length-1-index));
}
char Dec[40];
itoa(decimalismtemp,Dec,10);
Decimalism_To_Binary(Dec);
}
void Octonary_To_Decimalism(char base[])
{
int length = strlen(base);
int index;
long long decimalismtemp = 0;
for(index=0;index<length;index++)
{
decimalismtemp += (base[index]-'0')*(int)pow(8.0,length-1-index);
//printf("%d\n",(base[index]-'0')*(int)pow(8.0,length-1-index));
}
char Dec[40];
itoa(decimalismtemp,Dec,10);
printf("%s\n",Dec);
}
void Octonary_To_Hexadecimal(char base[])
{
int length = strlen(base);
int index;
long long decimalismtemp = 0;
for(index=0;index<length;index++)
{
decimalismtemp += (base[index]-'0')*(int)pow(8.0,length-1-index);
//printf("%d\n",(base[index]-'0')*(int)pow(8.0,length-1-index));
}
char Dec[40];
itoa(decimalismtemp,Dec,10);
Decimalism_To_Hexadecimal(Dec);
}
void Hexadecimal_To_Binary(char base[])
{
int length = strlen(base);
int index;
long long decimalismtemp = 0;
for(index=0;index<length;index++)
{
decimalismtemp += (base[index]-'0')*(int)pow(16.0,length-1-index);
//printf("%d\n",(base[index]-'0')*(int)pow(16.0,length-1-index));
}
char Dec[40];
itoa(decimalismtemp,Dec,10);
Decimalism_To_Binary(Dec);
}
void Hexadecimal_To_Octonary(char base[])
{
int length = strlen(base);
int index;
long long decimalismtemp = 0;
for(index=0;index<length;index++)
{
decimalismtemp += (base[index]-'0')*(int)pow(16.0,length-1-index);
//printf("%d\n",(base[index]-'0')*(int)pow(16.0,length-1-index));
}
char Dec[40];
itoa(decimalismtemp,Dec,10);
Decimalism_To_Octonary(Dec);
}
void Hexadecimal_To_Decimalism(char base[])
{
int length = strlen(base);
int index;
long long decimalismtemp = 0;
for(index=0;index<length;index++)
{
decimalismtemp += (base[index]-'0')*(int)pow(16.0,length-1-index);
//printf("%d\n",(base[index]-'0')*(int)pow(16.0,length-1-index));
}
char Dec[40];
itoa(decimalismtemp,Dec,10);
printf("%s\n",Dec);
}
int main()
{
char origin[40];
int from,to;
printf("\t这个程序仅支持2、8、10、16进制之间的相互转换\n");
printf("输入要转换的数: ");
scanf("%s",&origin);
printf("这个数的进制?: ");
scanf("%d",&from);
printf("要转换为的进制?: ");
scanf("%d",&to);
switch(from)
{
case 2:
{
switch(to)
{
case 8:Binary_To_Octonary(origin);break;
case 10:Binary_To_Decimalism(origin);break;
case 16:Binary_To_Hexadecimal(origin);break;
}
break;
}
case 8:
{
switch(to)
{
case 2:Octonary_To_Binary(origin);break;
case 10:Octonary_To_Decimalism(origin);break;
case 16:Octonary_To_Hexadecimal(origin);break;
}
break;
}
case 10:
{
switch(to)
{
case 8:Decimalism_To_Octonary(origin);break;
case 2:Decimalism_To_Binary(origin);break;
case 16:Decimalism_To_Hexadecimal(origin);break;
}
break;
}
case 16:
{
switch(to)
{
case 8:Hexadecimal_To_Octonary(origin);break;
case 10:Hexadecimal_To_Decimalism(origin);break;
case 2:Hexadecimal_To_Binary(origin);break;
}
break;
}
}
return 0;
}
不使用itoa或atoi的10进制向任意进制转换
#include <stdio.h>
void system_conv(char ss[], int n, int m){
char s[33];
int k = 0, t, i, j = 0;
if ( n == 0 ){ //当数为0,字符串直接是0
ss[0] = '0';
ss[1] = '\0'; //给出字符串的结尾
return;
}
if ( n < 0 ){ //负数字符串开头要加负号
ss[j++] = '-';
n = -n;//转绝对值才能用
}
while ( n > 0 ){
t = n%m;//取余数并生成序列
s[k++] = t>9 ? t-10+'A' : t+'0';//根据余数的值赋字符,若余数大于9说明目标进制是10+,采用字母表示一位
n /= m;//记得要使n变化,退出条件是n到0
}
for ( i = k-1; i>=0; --i ){ //将之前生成的字符串逆置
ss[j++] = s[i];
}
ss[j] = '\0'; //给出字符串的结尾,防止由于输出长度产生错误
}
int main(){
char s[33];
int n, m; //n是十进制数,m是转换的目标进制
while ( ~scanf("%d%d", &n, &m) ){
system_conv(s, n, m);
printf("%s\n", s);
}
return 0;
}
本文介绍如何在C语言中不使用itoa和atoi库函数,实现从10进制到2、8、10、16进制的非负整数转换方法。
838





