編寫C語言程序進(jìn)行進(jìn)制轉(zhuǎn)換的問題實(shí)例
題目
題目描述:
將M進(jìn)制的數(shù)X轉(zhuǎn)換為N進(jìn)制的數(shù)輸出。
輸入:
輸入的第一行包括兩個(gè)整數(shù):M和N(2<=M,N<=36)。
下面的一行輸入一個(gè)數(shù)X,X是M進(jìn)制的數(shù),現(xiàn)在要求你將M進(jìn)制的數(shù)X轉(zhuǎn)換成N進(jìn)制的數(shù)輸出。
輸出:
輸出X的N進(jìn)制表示的數(shù)。
樣例輸入:
16 10
F
樣例輸出:
15
提示:
輸入時(shí)字母部分為大寫,輸出時(shí)為小寫,并且有大數(shù)據(jù)。
思路
大整數(shù)乘法轉(zhuǎn)換成10進(jìn)制數(shù)組
大整數(shù)除法轉(zhuǎn)換成指定進(jìn)制數(shù)
AC代碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 2000
char str[LEN], another[LEN];
int ten[LEN];
int switchToTen();
void switchToAnother(int k, int n);
int main()
{
int m, n, k;
while (scanf("%d %d", &m, &n) != EOF) {
scanf("%s", str);
k = switchToTen(m);
switchToAnother(k, n);
}
return 0;
}
int switchToTen(int m)
{
int i, j, len, k, c;
//初始化
len = strlen(str);
k = 1;
memset(ten, 0, sizeof(ten));
//轉(zhuǎn)換為10進(jìn)制數(shù)
for (i = 0; i < len; i ++) {
for (j = 0; j < k; j ++) {
ten[j] *= m;
}
if (str[i] >= '0' && str[i] <= '9') {
ten[0] += str[i] - '0';
}else if (str[i] >= 'A' && str[i] <= 'Z') {
ten[0] += str[i] - 'A' + 10;
}else if (str[i] >= 'a' && str[i] <= 'z') {
ten[0] += str[i] - 'a' + 10;
}
for (j = c = 0; j < k; j ++) {
ten[j] += c;
if (ten[j] >= 10) {
c = ten[j] / 10;
ten[j] %= 10;
}else {
c = 0;
}
}
while (c) {
ten[k ++] = c % 10;
c /= 10;
}
}
//翻轉(zhuǎn)數(shù)組
int temp;
for (i = 0, j = k - 1; i < j; i ++, j --) {
temp = ten[i];
ten[i] = ten[j];
ten[j] = temp;
}
return k;
}
void switchToAnother(int k, int n)
{
int sum, i, r, t, d;
sum = 1;
r = 0;
memset(another, 0, sizeof(another));
while (sum) {
sum = 0;
for (i = 0; i < k; i ++) {
d = ten[i] / n;
sum += d;
if (i == k - 1) {
t = ten[i] % n;
if (t >= 0 && t <= 9) {
another[r] = t + '0';
}else {
another[r] = t - 10 + 'a';
}
r ++;
}else {
ten[i + 1] += ten[i] % n * 10;
}
ten[i] = d;
}
}
//打印是輸出
for (i = r - 1; i >= 0; i --) {
printf("%c", another[i]);
}
printf("\n");
}
/**************************************************************
Problem: 1080
User: wangzhengyi
Language: C
Result: Accepted
Time:170 ms
Memory:920 kb
****************************************************************/
下面附上一個(gè)二進(jìn)制、八進(jìn)制、十進(jìn)制、十六進(jìn)制互相轉(zhuǎn)化的C語言程序(有點(diǎn)長(zhǎng),嗯,看在功能n合一的份兒上XD)~
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void D_B(int);
void D_O(int);
void D_X(int);
void B_D(int);
void B_O(int);
void B_X(int);
void O_B(int);
void O_D(int);
void O_X(int);
void X_B(char r[],int k);
void X_D(char r[],int k);
void X_O(char r[],int k);
void main()
{
int i,j,k=0;
int q;
char r[10];
printf("+=============================================================+\n");
printf("| 歡 迎 使 用 進(jìn) 制 轉(zhuǎn) 換 程 序 |\n");
printf("+=============================================================+\n");
printf(" 注 : 本 版 本 只 做 正 整 數(shù) 的 進(jìn) 制 轉(zhuǎn) 換 ! !");
do
{
q=0;
//fflush(stdin);
printf("\n請(qǐng)選擇需要被轉(zhuǎn)換的進(jìn)制:\n0、退出\n1、二進(jìn)制\n2、八進(jìn)制\n3、十進(jìn)制\n4、十六進(jìn)制\n");
scanf("%d",&i);
switch (i)
{
case 1: printf("\n請(qǐng)選擇轉(zhuǎn)換后的進(jìn)制:\n0、退出\n1、二進(jìn)制\n2、八進(jìn)制\n3、十進(jìn)制\n4、十六進(jìn)制\n");
scanf("%d",&j);
switch(j)
{
case 1: printf("\n同進(jìn)制之間不用轉(zhuǎn)化!\n");
q=1;
break;
case 2: printf("\n請(qǐng)輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
B_O(k);
q=1;
break;
case 3: printf("\n請(qǐng)輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
B_D(k);
q=1;
break;
case 4: printf("\n請(qǐng)輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
B_X(k);
q=1;
break;
case 0:
printf("謝謝使用??!");
}
break;
case 2: printf("\n請(qǐng)選擇轉(zhuǎn)換后的進(jìn)制:\n0、退出\n1、二進(jìn)制\n2、八進(jìn)制\n3、十進(jìn)制\n4、十六進(jìn)制\n");
scanf("%d",&j);
switch(j)
{
case 2: printf("\n同進(jìn)制之間不用轉(zhuǎn)化!\n");
q=1;
break;
case 1: printf("\n請(qǐng)輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
O_B(k);
q=1;
break;
case 3: printf("\n請(qǐng)輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
O_D(k);
q=1;
break;
case 4: printf("\n請(qǐng)輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
O_X(k);
q=1;
break;
case 0:
printf("謝謝使用!!");
}
break;
case 3: printf("\n請(qǐng)選擇轉(zhuǎn)換后的進(jìn)制:\n0、退出\n1、二進(jìn)制\n2、八進(jìn)制\n3、十進(jìn)制\n4、十六進(jìn)制\n");
scanf("%d",&j);
switch(j)
{
case 3: printf("\n同進(jìn)制之間不用轉(zhuǎn)化!\n");
q=1;
break;
case 1: printf("\n請(qǐng)輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
D_B(k);
q=1;
break;
case 2: printf("\n請(qǐng)輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
D_O(k);
q=1;
break;
case 4: printf("\n請(qǐng)輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
D_X(k);
q=1;
break;
case 0:
printf("謝謝使用??!");
}
break;
case 4: printf("\n請(qǐng)選擇轉(zhuǎn)換后的進(jìn)制:\n0、退出\n1、二進(jìn)制\n2、八進(jìn)制\n3、十進(jìn)制\n4、十六進(jìn)制\n");
scanf("%d",&j);
switch(j)
{
case 4: printf("\n同進(jìn)制之間不用轉(zhuǎn)化!\n");
q=1;
break;
case 1: printf("\n請(qǐng)輸入您想要轉(zhuǎn)化的數(shù):");
fflush(stdin);
gets(r);
for(k=0;;k++)
{
if(r[k]=='\0')
break;
}
X_B(r,k);
q=1;
break;
case 2: printf("\n請(qǐng)輸入您想要轉(zhuǎn)化的數(shù):");
fflush(stdin);
gets(r);
for(k=0;;k++)
{
if(r[k]=='\0')
break;
}
X_O(r,k);
q=1;
break;
case 3: printf("\n請(qǐng)輸入您想要轉(zhuǎn)化的數(shù):");
fflush(stdin);
gets(r);
for(k=0;;k++)
{
if(r[k]=='\0')
break;
}
X_D(r,k);
q=1;
break;
case 0:
printf("謝謝使用!!");
}
break;
case 0: printf("\n謝謝使用!\n");
}
}while(q==1);
}
///////以下為: 二進(jìn)制轉(zhuǎn)換為十進(jìn)制,八進(jìn)制,十六進(jìn)制.
void B_D(int a)
{
int i,s=0;
int result=0;
for(i=1;a!=0;i*=2)
{
if(a%10>1)
{
s=1;
break;
}
else
{
result+=(a%10)*i;
a=a/10;
}
}
if(s==1)
printf("您的輸入有誤!請(qǐng)重新輸入\n");
else
printf("\n轉(zhuǎn)換后的數(shù)為:%d\n",result);
}
void B_O(int a)
{
int i,j,k,s=0;
int p[30];
int result=0;
for(i=1;a!=0;i*=2)
{
if(a%10>1)
{
s=1;
break;
}
else
{
result+=(a%10)*i;
a=a/10;
}
}
for(j=0;result!=0;j++)
{
p[j]=result%8;
result=result/8;
}
if(s==1)
printf("您的輸入有誤!請(qǐng)重新輸入\n");
else
{
printf("\n轉(zhuǎn)換后的數(shù)為:");
for(k=j-1;k>=0;k--)
{
printf("%d",p[k]);
}
printf("\n");
}
}
void B_X(int a)
{
int i,j,k,s=0;
char p[30];
int result=0;
for(i=1;a!=0;i*=2)
{
if(a%10>1)
{
s=1;
break;
}
else
{
result+=(a%10)*i;
a=a/10;
}
}
for(j=0;result!=0;j++)
{
p[j]=result%16;
result=result/16;
if (p[j]>10)
{
switch(p[j])
{
case 10: p[j]='A';
break;
case 11: p[j]='B';
break;
case 12: p[j]='C';
break;
case 13: p[j]='D';
break;
case 14: p[j]='E';
break;
case 15: p[j]='F';
break;
}
}
else p[j]+=48;
}
if(s==1)
printf("您的輸入有誤!請(qǐng)重新輸入\n");
else
{
printf("\n轉(zhuǎn)換后的數(shù)為:");
for(k=j-1;k>=0;k--)
{
printf("%c",p[k]);
}
printf("\n");
}
}
///////以下為: 八進(jìn)制轉(zhuǎn)換為二進(jìn)制,十進(jìn)制,十六進(jìn)制.
void O_B(int a)
{
int i,j,k,s=0;
int result=0;
int p[30];
for(i=1;a!=0;i*=8)
{if(a%10>7)
{
s=1;
break;
}
else
{
result+=(a%10)*i;
a=a/10;
}
}
for(j=0;result!=0;j++)
{
p[j]=result%2;
result=result/2;
}
if(s==1)
printf("您的輸入有誤!請(qǐng)重新輸入\n");
else
{
printf("\n轉(zhuǎn)換后的數(shù)為:");
for(k=j-1;k>=0;k--)
{
printf("%d",p[k]);
}
printf("\n");
}
}
void O_D(int a)
{
int i,s=0;
int result=0;
for(i=1;a!=0;i*=8)
{
if(a%10>7)
{
s=1;
break;
}
else
{
result+=(a%10)*i;
a=a/10;
}
}
if(s==1)
printf("您的輸入有誤!請(qǐng)重新輸入\n");
else
{
printf("\n轉(zhuǎn)換后的數(shù)為:%d\n",result);
}
}
void O_X(int a)
{
int i,j,k,s=0;
char p[30];
int result=0;
for(i=1;a!=0;i*=8)
{
if(a%10>7)
{
s=1;
break;
}
else
{
result+=(a%10)*i;
a=a/10;
}
}
for(j=0;result!=0;j++)
{
p[j]=result%16;
result=result/16;
if(p[j]<10)
p[j]+=48;
else
{
switch(p[j])
{
case 10: p[j]='A';
break;
case 11: p[j]='B';
break;
case 12: p[j]='C';
break;
case 13: p[j]='D';
break;
case 14: p[j]='E';
break;
case 15: p[j]='F';
break;
}
}
}
if(s==1)
printf("您的輸入有誤!請(qǐng)重新輸入\n");
else
{
printf("\n轉(zhuǎn)換后的數(shù)為:");
for(k=j-1;k>=0;k--)
{
printf("%c",p[k]);
}
printf("\n");
}
}
///////以下為: 十六進(jìn)制轉(zhuǎn)換為十進(jìn)制,二進(jìn)制,八進(jìn)制.
void X_D(char a[],int k)
{
int i,j,s=0;
int result=0;
int b[50];
for(i=0;i<k;i++)
{
if(a[i]<='9'&&a[i]>='1')
{ b[i]=a[i]-48;
}
else
{
switch(a[i])
{
case 'A': b[i]=10;
break;
case 'B': b[i]=11;
break;
case 'C': b[i]=12;
break;
case 'D': b[i]=13;
break;
case 'E': b[i]=14;
break;
case 'F': b[i]=15;
break;
case 'a': b[i]=10;
break;
case 'b': b[i]=11;
break;
case 'c': b[i]=12;
break;
case 'd': b[i]=13;
break;
case 'e': b[i]=14;
break;
case 'f': b[i]=15;
break;
default: s=1;
}
}
}
for(i=1,j=k-1;j>=0;j--,i*=16)
{
result+=b[j]*i;
}
if(s==1)
printf("您的輸入有誤!請(qǐng)重新輸入\n");
else
{
printf("\n轉(zhuǎn)換后的數(shù)為:%d",result);
}
}
void X_B(char a[],int k)
{
int i,j,s=0;
int result=0;
int b[50];
int p[30];
for(i=0;i<k;i++)
{
if(a[i]<='9'&&a[i]>='1')
b[i]=a[i]-48;
else
{
switch(a[i])
{
case 'A': b[i]=10;
break;
case 'B': b[i]=11;
break;
case 'C': b[i]=12;
break;
case 'D': b[i]=13;
break;
case 'E': b[i]=14;
break;
case 'F': b[i]=15;
break;
case 'a': b[i]=10;
break;
case 'b': b[i]=11;
break;
case 'c': b[i]=12;
break;
case 'd': b[i]=13;
break;
case 'e': b[i]=14;
break;
case 'f': b[i]=15;
break;
default: s=1;
}
}
}
for(j=k-1,i=1;j>=0;j--,i*=16)
{
result+=b[j]*i;
}
for(j=0;result!=0;j++)
{
p[j]=result%2;
result=result/2;
}
if(s==1)
printf("您的輸入有誤!請(qǐng)重新輸入\n");
else
{
printf("\n轉(zhuǎn)換后的數(shù)為:");
for(k=j-1;k>=0;k--)
{
printf("%d",p[k]);
}
printf("\n");
}
}
void X_O(char a[],int k)
{
int i,j,s=0;
int result=0;
int b[30];
int p[30];
for(i=0;i<k;i++)
{
if(a[i]<='9'&&a[i]>='1')
b[i]=a[i]-48;
else
{
switch(a[i])
{
case 'A': b[i]=10;
break;
case 'B': b[i]=11;
break;
case 'C': b[i]=12;
break;
case 'D': b[i]=13;
break;
case 'E': b[i]=14;
break;
case 'F': b[i]=15;
break;
case 'a': b[i]=10;
break;
case 'b': b[i]=11;
break;
case 'c': b[i]=12;
break;
case 'd': b[i]=13;
break;
case 'e': b[i]=14;
break;
case 'f': b[i]=15;
break;
default: s=1;
}
}
}
for(j=k-1,i=1;j>=0;j--,i*=16)
{
result+=b[j]*i;
}
for(j=0;result!=0;j++)
{
p[j]=result%8;
result=result/8;
}
if(s==1)
printf("您的輸入有誤!請(qǐng)重新輸入\n");
else
{
printf("\n轉(zhuǎn)換后的數(shù)為:");
for(k=j-1;k>=0;k--)
{
printf("%d",p[k]);
}
printf("\n");
}
}
///////以下為: 十進(jìn)制轉(zhuǎn)換為二進(jìn)制,八進(jìn)制,十六進(jìn)制.
void D_B(int a)
{
int j,k;
int p[30];
for(j=0;a!=0;j++)
{
p[j]=a%2;
a=a/2;
}
printf("\n轉(zhuǎn)換后的數(shù)為:");
for(k=j-1;k>=0;k--)
{
printf("%d",p[k]);
}
printf("\n");
}
void D_O(int a)
{
int j,k;
int p[30];
for(j=0;a!=0;j++)
{
p[j]=a%8;
a=a/8;
}
printf("\n轉(zhuǎn)換后的數(shù)為:");
for(k=j-1;k>=0;k--)
{
printf("%d",p[k]);
}
printf("\n");
}
void D_X(int a)
{
int j,k;
int p[30];
for(j=0;a!=0;j++)
{
p[j]=a%16;
a=a/16;
if(p[j]<10)
p[j]+=48;
else
{
switch(p[j])
{
case 10: p[j]='A';
break;
case 11: p[j]='B';
break;
case 12: p[j]='C';
break;
case 13: p[j]='D';
break;
case 14: p[j]='E';
break;
case 15: p[j]='F';
break;
}
}
}
printf("\n轉(zhuǎn)換后的數(shù)為:");
for(k=j-1;k>=0;k--)
{
printf("%c",p[k]);
}
printf("\n");
}
- C語言16進(jìn)制與ASCII字符相互轉(zhuǎn)換
- C語言每日練習(xí)之進(jìn)制轉(zhuǎn)換
- C語言的進(jìn)制轉(zhuǎn)換及算法實(shí)現(xiàn)教程
- C語言實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換函數(shù)的實(shí)例詳解
- C語言用棧實(shí)現(xiàn)十進(jìn)制轉(zhuǎn)換為二進(jìn)制的方法示例
- C語言中網(wǎng)絡(luò)地址與二進(jìn)制數(shù)之間轉(zhuǎn)換的函數(shù)小結(jié)
- C語言進(jìn)制轉(zhuǎn)換代碼分享
- C語言實(shí)現(xiàn)任意進(jìn)制轉(zhuǎn)換器
相關(guān)文章
Matlab制作視頻并轉(zhuǎn)換成gif動(dòng)態(tài)圖的兩種方法
這篇文章主要介紹了Matlab制作視頻并轉(zhuǎn)換成gif動(dòng)態(tài)圖的兩種方法,第一種方法使用movie(f)直接取生成AVI視頻文件,相對(duì)來說比較簡(jiǎn)單,需要的朋友可以參考下2018-08-08
C++實(shí)現(xiàn)LeetCode(34.在有序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(34.在有序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++?數(shù)據(jù)結(jié)構(gòu)超詳細(xì)講解單鏈表
這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之單鏈表,鏈表是由一個(gè)個(gè)結(jié)點(diǎn)鏈結(jié)成的。結(jié)點(diǎn)包括數(shù)據(jù)域和指針域兩部分,數(shù)據(jù)域用來存儲(chǔ)數(shù)據(jù)元素的信息,指針域用來存儲(chǔ)下一個(gè)結(jié)點(diǎn)的地址,更詳細(xì)內(nèi)容請(qǐng)需要的小伙伴參考下面文章內(nèi)容2022-03-03
C語言鏈表實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言鏈表實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06

