当前位置: 代码迷 >> 综合 >> [NOIP]数制转换
  详细解决方案

[NOIP]数制转换

热度:42   发布时间:2023-12-14 23:55:30.0

设有一个字符串A $的结构为:A $ ='m <n> p'

其中米为数字串(长度<= 20),而N,P均为1或2位的数字串(其中所表达的内容在2-10之间)。

要求:从键盘上读入甲$后(不用正确性检查),将甲$中的数字串米(N进制),以p进制的形式输出。

例如:48 <10> 8

其意义为:将10进制数48,转换成8进制数输出。

输出结果为:60 <8>

 

 

这个题目纯属自己想出来的算法,

可以说完全按照第一思路写出来的,肯定不是最佳算法,不过也AC啦。以下贴上代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main (void)
{char a[100],digit[100]={0},digit1[100]={0},digit2[100]={0};int shuzi1=0,jinzhi=0,shuzi2=0,yushu=0,shang=0,shuzu[100]={0},shuzi[100],t1=0,x=0;int length,i=0,t=0;scanf("%s",a);length=strlen(a);for(i=0;i<length;i++){if(a[i]=='<')break;digit[i]=a[i];;}i++;for(;i<length;i++){if(a[i]=='>')break;digit1[t]=a[i];t++;}i++;t=0;for(;i<length;i++){digit2[t]=a[i];t++;}shuzi1=atoi(digit);jinzhi=atoi(digit1);shuzi2=atoi(digit2);if(jinzhi!=10){x=shuzi1;while(x!=0){shuzi[t1]=x%10;x=x/10;t1++;}shuzi1=0;for(int i=t1-1;i>=0;i--){shuzi1=shuzi1+shuzi[i]*pow(jinzhi,i);}}jinzhi=10;if(jinzhi==10){shuzu[yushu]=shuzi1%shuzi2;shang=shuzi1/shuzi2;yushu++;while(shang!=0){shuzu[yushu]=shang%shuzi2;shang=shang/shuzi2;yushu++;}for(int i=yushu-1;i>=0;i--)printf("%d",shuzu[i]);printf("<%d>",shuzi2);}} 

思路很简单,以‘<’,‘>’字符为分隔符,将输入的字符串分割成待转换的数字,原来的进制,需要转换的进制三个字符串,然后用atoi方法将三个字符串转换成int型的数字。

然后就是进制转换算法,进制之间如何转化这里不多加赘述,如果原来的数字是十进制的,则直接进行进制转换,如果不是十进制,则将数字先转换成十进制,再进行进制转换。

 

NOOB纯手打,如有不足,欢迎指正!