输入该数字的原进制 ,使用局部变量primitivesystem2. 输入该数字,使用局部变量number 3. 输入想获得的进制,使用局部变量system 4.进制转换 ,调用函数binaryconversion和change,5. 获得目的数
#include "stdio.h"
int decimalconversion(int number,int primitivesystem,int system);//转十进制函数
int binaryconversion(int number);//转二进制函数
void change(int number,int primitivesystem,int system);//进制相互转换函数
int judge(int number,int primitivesystem);//除十六进制外,判断非法函数
void input(int number,int primitivesystem);//输入函数
int main(void) {
printf("请输入将输入数为什么进制数\n");
int primitivesystem;
scanf("%d",&primitivesystem);
int number=0;
int flag=1;
printf("请输入该数字\n");
char hexad[100];
if(primitivesystem!=16){
scanf("%d",&number);
}
else{
scanf("%s",&hexad);
for(int i=0;hexad[i]!='\0';i++){
if(hexad[i]>='0'&&hexad[i]<='9'){
number=number*16+hexad[i]-'0';
}
else if(hexad[i]>='A'&&hexad[i]<='F'){
number=number*16+hexad[i]-'A'+10;
}
else if(hexad[i]>='a'&&hexad[i]<='f'){
number=number*16+hexad[i]-'a'+10;
}// 将十六进制字符串转为十进制
else{
printf("该数字非法,请重新输入");
flag=0;
break;
}//判断十六进制输入是否非法
}
if(flag==1){
primitivesystem=10;
input(number,primitivesystem);
}
}
int remainder=0,copy=number;
if(primitivesystem==2){
judge(copy,primitivesystem);//调用判断非法函数
if(judge(copy,primitivesystem)){
input(number,primitivesystem);//调用输入函数
}
}
else if(primitivesystem==8){
judge(copy,primitivesystem);//调用判断非法函数
if(judge(copy,primitivesystem)){
input(number,primitivesystem);//调用输入函数
}
}
return 0;
}
使用递归将传入的number转为二进制数,分为两种情况,通过number/2==0的返回值,可以运用递归求出结果
int binaryconversion(int number){
if(number/2==0){
return number%2;
}
else{
return number%2+binaryconversion(number/2)*10;
}
}
进行进制转换,主要通过将十进制转换为别的进制,及别的进制转换为十进制的思想,传入number,primitivesystem,system的值
void change(int number,int primitivesystem,int system)//进制相互转换函数{
int sum=0;
int product=1;
if(primitivesystem==10)//数原进制为十进制{
if(system==2){
binaryconversion(number);
printf("%d\n",binaryconversion(number));
}
else if(system==8){
printf("%o\n",number);
}
else if(system==16){
printf("%x\n",number);
}
else{
printf("%d\n",number);//因为若为十六进制数输入,已将转为十进制数 ,再进行函数转换
}
}
else if(primitivesystem==8)//数原进制为八进制{
if(system==2){
sum=decimalconversion(number,primitivesystem,system);
binaryconversion(sum);
printf("%d\n",binaryconversion(sum));
}
else if(system==10){
sum=decimalconversion(number,primitivesystem,system);
printf("%d\n",sum);
}
else if(system==16){
sum=decimalconversion(number,primitivesystem,system);
printf("%x\n",sum);
}
}
else if(primitivesystem==2)//数原进制为二进制{
if(system==8){
sum=decimalconversion(number,primitivesystem,system);
printf("%o\n",sum);
}
else if(system==10){
sum=decimalconversion(number,primitivesystem,system);
printf("%d\n",sum);
}
else if(system==16){
sum=decimalconversion(number,primitivesystem,system);
printf("%x\n",sum);
}
}
}
判断除十六进制外的输入非法,传入number与primitivesystem的值
int judge(int copy,int primitivesystem)//判断非法函数{
int remainder=0;
int flag=1;
do{
remainder=copy%10;
copy=copy/10;
if(remainder>primitivesystem-1){
printf("该数字非法,请重新输入\n");
flag=0;
break;
}
}while(copy);
return flag;
}
进行system的输入及目的数的输出
void input(int number,int primitivesystem)//输入函数{
printf("请输入你想得到该数的什么进制数\n");
int system;
scanf("%d",&system);
printf("你将得到你想要的结果\n");
change(number,primitivesystem,system);
printf("感谢使用\n");
}
对非十六进制数转为十进制数,传入number,primitivesystem,system的值
int decimalconversion(int number,int primitivesystem,int system)//转为十进制{
int sum=0;
int product=1;
do{
sum=sum+(number%10)*product;
number=number/10;
product=product*primitivesystem;
}while(number);
return sum;
}
完整代码
#include "stdio.h"
int decimalconversion(int number,int primitivesystem,int system);//转十进制函数
int binaryconversion(int number);//转二进制函数
void change(int number,int primitivesystem,int system);//进制相互转换函数
int judge(int number,int primitivesystem);//除十六进制外,判断非法函数
void input(int number,int primitivesystem);//输入函数
int main(void) {
printf("请输入将输入数为什么进制数\n");
int primitivesystem;
scanf("%d",&primitivesystem);
int number=0;
int flag=1;
printf("请输入该数字\n");
char hexad[100];
if(primitivesystem!=16){
scanf("%d",&number);
}
else{
scanf("%s",&hexad);
for(int i=0;hexad[i]!='\0';i++){
if(hexad[i]>='0'&&hexad[i]<='9'){
number=number*16+hexad[i]-'0';
}
else if(hexad[i]>='A'&&hexad[i]<='F'){
number=number*16+hexad[i]-'A'+10;
}
else if(hexad[i]>='a'&&hexad[i]<='f'){
number=number*16+hexad[i]-'a'+10;
}// 将十六进制字符串转为十进制
else{
printf("该数字非法,请重新输入");
flag=0;
break;
}//判断十六进制输入是否非法
}
if(flag==1){
primitivesystem=10;
input(number,primitivesystem);
}
}
int remainder=0,copy=number;
if(primitivesystem==2){
judge(copy,primitivesystem);//调用判断非法函数
if(judge(copy,primitivesystem)){
input(number,primitivesystem);//调用输入函数
}
}
else if(primitivesystem==8){
judge(copy,primitivesystem);//调用判断非法函数
if(judge(copy,primitivesystem)){
input(number,primitivesystem);//调用输入函数
}
}
return 0;
}
void change(int number,int primitivesystem,int system)//进制相互转换函数{
int sum=0;
int product=1;
if(primitivesystem==10)//数原进制为十进制{
if(system==2){
binaryconversion(number);
printf("%d\n",binaryconversion(number));
}
else if(system==8){
printf("%o\n",number);
}
else if(system==16){
printf("%x\n",number);
}
else{
printf("%d\n",number);//因为若为十六进制数输入,已将转为十进制数 ,再进行函数转换
}
}
else if(primitivesystem==8)//数原进制为八进制{
if(system==2){
sum=decimalconversion(number,primitivesystem,system);
binaryconversion(sum);
printf("%d\n",binaryconversion(sum));
}
else if(system==10){
sum=decimalconversion(number,primitivesystem,system);
printf("%d\n",sum);
}
else if(system==16){
sum=decimalconversion(number,primitivesystem,system);
printf("%x\n",sum);
}
}
else if(primitivesystem==2)//数原进制为二进制{
if(system==8){
sum=decimalconversion(number,primitivesystem,system);
printf("%o\n",sum);
}
else if(system==10){
sum=decimalconversion(number,primitivesystem,system);
printf("%d\n",sum);
}
else if(system==16){
sum=decimalconversion(number,primitivesystem,system);
printf("%x\n",sum);
}
}
}
int binaryconversion(int number)//二进制转换函数{
if(number/2==0){
return number%2;
}
else{
return number%2+binaryconversion(number/2)*10;
}
}
int decimalconversion(int number,int primitivesystem,int system)//十进制转换函数{
int sum=0;
int product=1;
do{
sum=sum+(number%10)*product;
number=number/10;
product=product*primitivesystem;
}while(number);
return sum;
}
void input(int number,int primitivesystem)//输入函数{
printf("请输入你想得到该数的什么进制数\n");
int system;
scanf("%d",&system);
printf("你将得到你想要的结果\n");
change(number,primitivesystem,system);
printf("感谢使用\n");
}
int judge(int copy,int primitivesystem)//判断非法函数{
int remainder=0;
int flag=1;
do{
remainder=copy%10;
copy=copy/10;
if(remainder>primitivesystem-1){
printf("该数字非法,请重新输入\n");
flag=0;
break;
}
}while(copy);
return flag;
}
十六进制的输入:不能跟别的进制输入一样,通过对字符串的了解,使用%s输入
对于数字非法的判断中,出现该部分代码影响别的代码运行的情况,不断地调试及设置断点
忘记初始化number的值,导致十六进制数的进制转换混乱
输入方面,他直接字符数串输入,避免了我的分情况输入
int Tennum(char a[],int b)
{
int len, i, num;
int sum = 0;
len = strlen(a);
for (i = 0; i < len; i++)
{
if (a[i] >= '0' && a[i] <= '9')
{
num = a[i] - '0';
}
else if (a[i] >= 'A' && a[i] <= 'F')
{
num = a[i] - 'A' + 10;
}
sum = sum * b + num;
}
return sum;
}
他的 Numchange函数,利用pow来进行十进制转各进制,我的decimalconversion函数通过循环,实现各进制转十进制,再实现十进制转各进制
void Numchange(int m, int b)
{
int n = m;
int count = 0;
if (m == 0) printf("0");
while (n != 0)
{
n = n / b;
count++;
}
int number;
for (int i = count; i >= 1; i--)
{
number = m / (int)pow(b, i - 1);
if (number < 10) {
printf("%d", number);
}
else {
printf("%c", number + 55);
}
m = m % (int)pow(b, i - 1);
}
}
原文:https://www.cnblogs.com/tylk/p/11815722.html