将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进制,但程序不正确。。的主要内容,如果未能解决你的问题,请参考以下文章