Ⅰ 十進制的數如何轉換成R進制的數
將十進制轉化為R進制(R>=2)整數部分除R取余直到商為零,將這些余數逆序排列。小數部分乘以R取整直到無小數,最後兩者相加。
如123.45
123/16=7
餘11
11是B
7/16=0
餘7
7
小數部分
0.45*16=7.2
7
0.2*16=3.2
3
...
最後結果:7B.7333...
Ⅱ 利用棧的基本操作實現將任意一個十進制整數轉化為R進制整數
看到這道題目想到了三個方法,依次給你列出(棧的方式,遞歸,數組)
棧的方式:
//思路:將十進制數(number)除以R取余,讓取得的余數(number Mod R )進棧,讓十進制數變為
number/R,重復上述過程,直到number等於0為止,然後依次從棧中取出數據即為所求,直到棧為空,下面是實現的代碼:
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 80
typedef struct
{//棧的數據結構,採用數組
char data[MAX_SIZE];
int top;
}stack;
int isfull(stack s)
{//判斷棧是否已滿
return (++s.top==MAX_SIZE);
}
int isempty(stack s)
{//判斷棧為空
return s.top==-1;
}
void push(stack * s,char in_data)
{//進棧
if(isfull(*s))
{
printf("棧已滿,不能執行操作!\n");
exit(1);
}
s->data[++s->top]=in_data;
}
void pop(stack *s)
{//出棧
if(isempty(*s))
{
printf("棧已空,不能執行操作!\n");
exit(1);
}
s->top--;
}
char top_value(stack *s)
{//取棧頂元素
if(isempty(*s))
{
printf("棧已空,不能執行操作!\n");
exit(1);
}
return s->data[s->top];
}
int main(int argc,char** argv)
{
int number;
stack result;
result.top=-1;
int r_range;
printf("輸入轉換的數據和對應的進制:");
scanf("%d%d",&number,&r_range);
printf("%d對應的%d進制為:",number,r_range);
while(number!=0)
{
char input;
if(number%r_range>=10)
input=((number%r_range)-10)+'a';
else
input=((number%r_range)+'0');
push(&result,input);
number=number/r_range;
}
while(!isempty(result))
{
putchar(top_value(&result));
pop(&result);
}
return 0;
}
====================================================================
遞歸的方式:定義一個輸出字元串,讓十進制數(number)除以要轉換的進制R 若結果不為0,則繼續執行前述操作,直到得到除的結果為零,此時number除以R取其餘數,將其結果(number Mod R)映射到指定的輸出字元數組中下標輸出即為結果(描述的不是很好,你看代碼吧)
//用這種方法也比較可以
#include<stdio.h>
void ten_to_any(int number,int range_t)
{//遞歸實現
char text[]="0123456789abcdef";
int k=number/range_t;
if(k)
ten_to_any(k,range_t);
putchar(text[number%range_t]);
}
int main()
{
int number,r_range;
while(1)
{
printf("\n輸入轉換的數據,和對應進制:");
scanf("%d%d",&number,&r_range);
if(r_range>16||r_range<2)
{
printf("超出了范圍!");
break;
}
printf("%d對應的%d進制為:",number,r_range);
ten_to_any(number,r_range);
}
return 0;
}
//採用數組的形式
這是我上次回答別人的
用一個字元串保存轉換的結果(str[80])假設十進制數為number,轉換的進制為digits,則將numbers%digits(根據余數的情況做相應處理)結果保存在字元串str中,將numbers變為numbers/digits;直到numbers為零。得到的結果為逆序,需要將其倒轉,倒轉後即為所求。
//-----------c語言實現10進制轉2~16進制
#include<stdio.h>
#include<string.h>
void TentoAny(int number,char *str,int digits)
{
int i=0;
if(digits>16||digits<2)//非2~16進制則直接退出
return ;
while(number)
{
if(number%digits>=10)
{
str[i++]='A'+(number%digits-10);
}
else
{
str[i++]=number%digits+'0';
}
}
str[i]='\0';
strrev(str);//strrev函數定義在string.h中的,是對字元串做逆序處理的函數
//這里需要逆序的原因是因為得到的結果為該進制的逆序
}
int main()
{
int number,i;
char str[80];
printf("輸入一個十進制數:");
scanf("%d",&number);
printf("\n---------2到16進制對應關系----------\n");
for(i=2;i<=16;i++)
{
TentoAny(number,str,i);
printf("%d轉換為%d進制為:%s\n",number,i,str);
}
return 0;
}
//希望對你有所幫助
Ⅲ Python二級中的進制轉換:看這一篇就夠了
在計算機領域,進制轉換是基礎且常見的操作,雖在Python二級考試中權重不高,但掌握這些技能對於編程實踐十分重要。
進制轉換包括:二進制、八進制、十六進制與十進制之間的轉換。
一、進制轉換為十進制
對於不同進制數轉換為十進制數,我們採用「按權展開」法,從右到左計算每一位置上的數值與對應權重的乘積,再將結果相加。例如:
二進制轉十進制:從右至左,每位數值乘以2的冪次方。例如,二進制1011轉換為十進制是1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 11。
八進制轉十進制:從右至左,每位數值乘以8的冪次方。例如,八進制347轉換為十進制是7*8^0 + 4*8^1 + 3*8^2 = 231。
十六進制轉十進制:從右至左,每位數值乘以16的冪次方,其中A-F分別代表10-15。例如,十六進制1A3轉換為十進制是3*16^0 + 10*16^1 + 1*16^2 = 419。
二、十進制轉換為進制
將十進制數轉換為其他進制採用「除R取余」法。具體步驟為:不斷將十進制數除以目標進制數,記錄每次除法的余數,最後將余數倒序排列。例如:
十進制轉二進制:不斷除以2,記錄余數,結果為11011101。
十進制轉八進制:不斷除以8,記錄余數,結果為137。
十進制轉十六進制:不斷除以16,記錄余數,對於大於9的余數,使用A-F字母表示,結果為ABC。
三、二進制、八進制和十六進制的互轉
為簡化記憶,可以先將非十進制數轉換為十進制,再進行其他進制的轉換。如二進制轉十六進制,先轉換為十進制,再將十進制數轉換為十六進制。
四、學習總結
進制轉換基於權重概念,不同進制的權重不同(二進制為2的冪,八進制為8的冪,十六進制為16的冪)。掌握上述方法,能夠輕松進行任意進制間的轉換,對於編程實踐和計算機科學的學習至關重要。