将n进制数转换为m进制,但程序不正确。。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将n进制数转换为m进制,但程序不正确。。相关的知识,希望对你有一定的参考价值。

参考技术A 好了,改好了!
/*将n进制数转换为m进制数(2<=n,m<=10)*/
#include
<stdio.h>
#include
<math.h>
void
main()

int
a,b,t=0,i=0,s[16],n,m,k,a1;
i=0;
start:
printf("输入进制n:");
scanf("%d",&n);
if(n<2||n>10)

printf("you
input
a
wrong
number");
goto
start;

printf("\n输入一个%d进制数:",n);
scanf("%d",&a);
a1=a;
printf("\n输入转换后的进制m:");
scanf("%d",&m);
if(m<2||m>10)

printf("you
input
a
wrong
number");
goto
start;

do
/*将n进制数a转换为10进制数t*/

b=a%10;
a=a/10;
k=(int)pow(n,i);
t=t+b*k;
i++;

while(a!=0);
i=0;
/*将10进制数t转换为m进制数(赋值给数组s)*/
do

b=t%m;
t=t/m;
s[i]=b;
i++;

while(t!=0);
printf("\n%d进制:%d
->
%d进制:",n,a1,m);
for(i=i-1;i>=0;i--)
/*输出m进制数(数组s)*/
printf("%d",s[i]);
printf("\n\n");

P1143 进制转换

大致题意:

  • 给定一个n进制的数,把它转换为m进制的数。

总体思路:

  • 以10进制为中间进制,

  • 把n进制的数转换为10进制,

  • 再转换为m进制,

  • 最后输出。

然后说一说如何进行n进制转10进制10进制转m进制

n进制转10进制

  • 我们有一种方式可以来表示一个n进制数: 将每个阿拉伯数字乘以一个以该数字所处位置为指数,以n为底数的幂之和的形式。例如 233(8) 可表示为 2×82+3×81+3×80 这样的形式。

  • 那么根据这个方式,我们就可以将n进制转换为10进制了。

  • 具体来说,我们从这个数的末尾往前推,以一个t变量表示以该数字所处位置为指数,以n为底数的幂,然后再用一个变量累加每次的乘积,最后就可以得到10进制的这个数了。

  • for(int i=sLen-1;i>=0;--i){//倒推,sLen表示字符串的长度
        num_10+=mp[s[i]]*t;//累加乘积,mp[s[i]]表示s[i]这个字符所代表的数字
        t*=n;//求前一位的“以该数字所处位置为指数,以n为底数的幂”
    }
    

10进制转m进制

  • 10进制转m进制就好办了,以这个数不断模m,模出的数存到数组里,然后除以m,一直到这个数为0之后停止。

  • while(num_10){//不为0不退出
        ans[++tot]=ch[num_10%m];//存到数组里,ch[num_10%n]代表的是取模出来的数的字符(因为类似于11不能直接输出,需要变为字符)
        num_10/=m;//除以m
    }
    
  • 注: 答案应该是将ans数组反过来,因为每次取模的数都应该从后往前放,但是并不知道要放多少个,所以就"正着进去,反着输出"。

Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
using namespace std;
#define R read()
#define GC getchar()
#define ll long long
#define ull unsigned long long
#define INF 0x7fffffff
#define LLINF 0x7fffffffffffffff
ll read(){
    ll s=0,f=1;
    char c=GC;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-f;c=GC;}
    while(c>=‘0‘&&c<=‘9‘){s=s*10+c-‘0‘;c=GC;}
    return s*f;
}
int n,m;
string s;
int sLen;
int num_10,t=1;//nun_10是存放10进制数的变量,t是"以该数字所处位置为指数,以n为底数的幂"
char ch[20]={‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘};
map<char,int> mp;
char ans[100010];//记录答案的数组
int tot;
int main(){
    for(int i=0;i<16;++i){
        mp[ch[i]]=i;
    }
    cin>>n>>s>>m;
    sLen=s.length();
    //n进制转10进制
    for(int i=sLen-1;i>=0;--i){//倒推,sLen表示字符串的长度
        num_10+=mp[s[i]]*t;//累加乘积,mp[s[i]]表示s[i]这个字符所代表的数字
        t*=n;//求前一位的“以该数字所处位置为指数,以n为底数的幂”
    }
    //10进制转m进制
    while(num_10){//不为0不退出
        ans[++tot]=ch[num_10%m];//存到数组里,ch[num_10%n]代表的是取模出来的数的字符(因为类似于11不能直接输出,需要变为字符)
        num_10/=m;//除以m
    }
    for(int i=tot;i>=1;--i){//倒着输出
        printf("%c",ans[i]);
    }
    return 0;
}

以上是关于将n进制数转换为m进制,但程序不正确。。的主要内容,如果未能解决你的问题,请参考以下文章

n进制转成m进制的方法

给定一个十进制数M,以及需要转换的进制数N。 将十进制数M转化为N进制数

进制转换,请将一个n进制的数转换成m进制的数,并输出.

进制转换

在 C 中将二进制转换为十进制会出错

进制转换