【数制转换问题 】 大讨论
栈的简单应用:数制转换问题(将十进制数N转换为r进制的数)
将十进制数N转换为r进制的数,其转换方法利用辗转相除法:以N=3456,r=8为例转换方法如下:
N N / 8 (整除) N % 8(求余)
3467 433 3 低
433 54 1
54 6 6
6 0 6 高
所以:(3456)10 =(6563)8
我们看到所转换的8进制数按底位到高位的顺序产生的,而通常的输出是从高位到低位的,恰好与计算过程相反,因此转换过程中每得到一位8进制数则进栈保存,转换完毕后依次出栈则正好是转换结果。
基本算法思想如下:当N>0时重复1,2
1. 若 N≠0,则将N % r 压入栈s中 ,执行2;若N=0,将栈s的内容依次出栈,算法结束。
2. 用N / r 代替 N
我在网上找过很多,感觉都不是怎么好,我想和大家讨论一下用java,c#语言分别应该怎么编写这个问题?
[解决办法]
是这个不?
import java.util.Scanner;
public class xxx {
public static void main(String[] args) {
Scanner scan= new Scanner(System.in);
int n=scan.nextInt();
int r=8;
int p=0;
char x;
String s=new String();
while(n>0){
p=n%r;
if(p>9){
x=(char) (p+65-10);
}else{
x=(char) (p+48);
}
s=x+s;
n=n/r;
}
System.out.println(s);
}
}
#include <iostream>
#include <stack>
using namespace std;
int main()
{
int n, m;
char temp;
stack<char> number;
while(cin >> n >> m)
{
if(0 == n)
{
cout << "0" << endl;
continue;
}
if(n < 0)
{
cout << "-";
n = -n;
}
while(n > 0)
{
temp = n % m;
if(temp < 10)
temp += '0';
else
temp = temp - 10 + 'A';
number.push(temp);
n /= m;
}
while(!number.empty())
{
cout << number.top();
number.pop();
}
cout << endl;
}
return 0;
}
void conversion()
{
//十进制到八进制
InitStack(S); //建空栈
scanf("%d", &x); //输入一个非负十进制整数
while (x != 0) // x不等于零,循环
{
push(S, x % 8); // x/8余数进栈
x = x / 8; //整除运算
}
while (! StackEmpty(S)) //输出存放在栈中的八进制数位
{
pop(S, x);
printf("%d",x);
}
}