編寫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)長,嗯,看在功能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請選擇需要被轉(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請選擇轉(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請輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
B_O(k);
q=1;
break;
case 3: printf("\n請輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
B_D(k);
q=1;
break;
case 4: printf("\n請輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
B_X(k);
q=1;
break;
case 0:
printf("謝謝使用!!");
}
break;
case 2: printf("\n請選擇轉(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請輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
O_B(k);
q=1;
break;
case 3: printf("\n請輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
O_D(k);
q=1;
break;
case 4: printf("\n請輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
O_X(k);
q=1;
break;
case 0:
printf("謝謝使用?。?);
}
break;
case 3: printf("\n請選擇轉(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請輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
D_B(k);
q=1;
break;
case 2: printf("\n請輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
D_O(k);
q=1;
break;
case 4: printf("\n請輸入您想要轉(zhuǎn)化的數(shù):");
scanf("%d",&k);
D_X(k);
q=1;
break;
case 0:
printf("謝謝使用??!");
}
break;
case 4: printf("\n請選擇轉(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請輸入您想要轉(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請輸入您想要轉(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請輸入您想要轉(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("您的輸入有誤!請重新輸入\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("您的輸入有誤!請重新輸入\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("您的輸入有誤!請重新輸入\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("您的輸入有誤!請重新輸入\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("您的輸入有誤!請重新輸入\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("您的輸入有誤!請重新輸入\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("您的輸入有誤!請重新輸入\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("您的輸入有誤!請重新輸入\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("您的輸入有誤!請重新輸入\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)文章
基于C語言實(shí)現(xiàn)的TCP服務(wù)器的流程分析
本文詳細(xì)介紹了如何使用C語言編寫一個(gè)簡單的TCP服務(wù)器,包括創(chuàng)建套接字、綁定IP和端口、監(jiān)聽連接請求、接受客戶端連接、數(shù)據(jù)接收與發(fā)送以及關(guān)閉套接字等步驟,最后通過一個(gè)簡單的示例展示了TCP服務(wù)器的基本實(shí)現(xiàn)過程2024-10-10
QT的QWebEngineView類知識(shí)點(diǎn)詳細(xì)介紹
QWebEngineView是Qt框架中的組件,基于Chromium內(nèi)核,支持HTML5、CSS3、JavaScript等Web技術(shù),適用于嵌入網(wǎng)頁內(nèi)容到Qt應(yīng)用程序,它提供了豐富的接口如加載、導(dǎo)航、與JavaScript交互等,并支持信號(hào)槽機(jī)制處理各種網(wǎng)頁事件,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10
C++ 實(shí)現(xiàn)旋轉(zhuǎn)蛇錯(cuò)覺的詳細(xì)代碼
這篇文章主要介紹了C++ 實(shí)現(xiàn)旋轉(zhuǎn)蛇錯(cuò)覺的詳細(xì)代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
C語言靜態(tài)與動(dòng)態(tài)通訊錄的實(shí)現(xiàn)流程詳解
這篇文章主要為大家介紹了C語言分別實(shí)現(xiàn)靜態(tài)與動(dòng)態(tài)的通訊錄示例代碼教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11
C語言實(shí)現(xiàn)一個(gè)文件版動(dòng)態(tài)通訊錄流程詳解
這篇文章主要介紹了C語言實(shí)現(xiàn)一個(gè)文件版動(dòng)態(tài)通訊錄流程,希望大家能從這篇文章中收獲到許多,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
C++判斷主機(jī)是否處于聯(lián)網(wǎng)狀態(tài)
這篇文章主要為大家詳細(xì)介紹了C++判斷主機(jī)是否處于聯(lián)網(wǎng)狀態(tài),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
C語言中調(diào)用Swift函數(shù)實(shí)例詳解
這篇文章主要介紹了C語言中調(diào)用Swift函數(shù)實(shí)例詳解的相關(guān)資料,實(shí)現(xiàn)該功能可以通過定義全局的指向Blocks的對象指針來實(shí)現(xiàn),需要的朋友可以參考下2017-07-07

