zoukankan      html  css  js  c++  java
  • poj 1220(短除法)

    http://poj.org/problem?id=1220

    题意:进制转换,把a进制转换为b进制。

    如果数据不大的话,那么这个题还是很简单的,但这个题就是数据范围太大,所以这里可以采用短除法来做。

    关于短除法,就是把每一位(这里指的每一位是指个位十位之类的)除以要转换的进制的余数在乘以当前进制的值加到下一位去,当前位的值就为商,然后这样一直进行到最后一位(也就是个位)个位在对所须转换的进制在取模,那么这个模就是转换后的结果。多次重复,直到最后一位为0,从后往前看就是答案。

    举个例子:50,要从十进制转换为二进制。

    十位是5,个位是0,那么首先5/2商为2,余1

    下一步就是1*10+0=10,然后个位就变成了10,然后10/2=5余0,0就是结果的个位,

    然后下一步就是对25进行操作

    2/2商1余0,那么十位就是1,个位就是0*10+5=5.

    5/2商2余1,那么结果的十位就是1。

    然后对12进行操作,十位是1,1/2商0余1,那么十位就为0了。

    个位就是1*10+2=12.12/2商6余0,结果的百位就是0.

    因为十位是0,所以只对个位进行操作了,6/2商3余0,千为就是0

    3/2商1余1,万位为1.

    1/2商0余1,十万位为1,所以50转换为二进制就是110010

     1 #include <stdio.h>
     2 #include <string.h>
     3 #define l 600
     4 
     5 int a,b,ans[l],tmp[l];
     6 char c[l];
     7 
     8 int main()
     9 {
    10     int n,k;
    11     scanf("%d",&n);
    12     while(n--)
    13     {
    14         memset(tmp,0,sizeof(tmp));
    15         memset(ans,0,sizeof(ans));
    16         memset(c,0,sizeof(c));
    17         scanf("%d%d%s",&a,&b,c);
    18         int len=strlen(c);
    19         for(int i=0,m=len-1;i<len;i++,m--){      //这里要注意,要把最低位放在tmp[0],因为始终是取最低位的余数为答案的。
    20             if(c[m]>='A'&&c[m]<='Z'){
    21                 tmp[i]=c[m]-'A'+10;
    22                 continue;
    23             }
    24             if(c[m]>='a'&&c[m]<='z'){
    25                 tmp[i]=c[m]-'a'+36;
    26                 continue;
    27             }
    28             else {
    29                 tmp[i]=c[m]-'0';
    30             }
    31         }
    32         for(k=0;len;){
    33             for(int i=len-1;i;i--)                 //这就是短除法。
    35             {
    36                 tmp[i-1]+=tmp[i]%b*a;
    37                 tmp[i]/=b;
    38             }
    39             ans[k++]=tmp[0]%b;
    40             tmp[0]/=b;
    41             for(;len>0&&!tmp[len-1];len--);
    42         }
    43         printf("%d %s
    %d ",a,c,b);
    44         for(int i=k-1;i>=0;i--)    //输出答案,逆序输出
    45         {
    46             if(ans[i]>=10&&ans[i]<36){
    47                 printf("%c",ans[i]-10+'A');
    48                 continue;
    49                 }
    50             if(ans[i]>=36){
    51                 printf("%c",ans[i]-36+'a');
    52             }
    53             else printf("%d",ans[i]);
    54         }
    55         printf("
    
    ");
    56     }
    57     return 0;
    58 }
  • 相关阅读:
    写给新的一年(2015)
    Lucene.Net 入门级实例 浅显易懂。。。
    EF webapi json序列化 表间相互引用 无限循环问题解决方案
    java枚举使用详解,整理的很好,只能收下。。。
    mac
    ASP.NET Web API 全局权限和异常处理
    c# 与 java 语法异同
    tfs 报错解决方案:tf400324
    使用C#开发ActiveX控件
    android 更新listview 其中一行的数据显示
  • 原文地址:https://www.cnblogs.com/Tree-dream/p/5710976.html
Copyright © 2011-2022 走看看