zoukankan      html  css  js  c++  java
  • Hdu 2100 Lovekey 模拟大数相加<进位转换..>

    题意:

    用A~Z表示0~25..

    给出2个200以内的XYZ-26进制数..即a0 a1 a2 a3……an

    求出和..用XYZ-26进制表示..

    其中XYZ-26 -> 10进制是m = a0 * 26^(n-1) + a1 * 26^(n-2) + … + an-3* 26^2 + an-2*26 + an-1 

    思路:

    不用进行转换然后相加再换回去..

    直接相加..

    模拟进位..

    Tips:

    ※可以直接把短的加到长的字符串上..eg:ABC+CD就是           ABC

                                         +  CD

                                       ------------

                                          BFL

    ※ 主要是进位的时候要考虑清楚..

    ※ 在长字符串上处理..就不用担心不知道该在前面保留多少位的问题了..

    ※ 输出去前导无意义 ‘A' 的时候要考虑到AAAAA的情况..最后输出'A'

     

    Code:

    View Code
     1 #include <stdio.h>
     2 #include <cstring>
     3 
     4 void add(char *a, char *b)
     5 {
     6     int i, j, k;
     7     int len1, len2;
     8     int tmp=0;
     9     len1 = strlen(a), len2 = strlen(b);
    10     for(i = len1-1, j = len2-1; i >= 0;){
    11         if(j >= 0){
    12             a[i] = a[i] - 'A' + b[j] + tmp;
    13             tmp = 0;
    14             if(a[i] > 'Z'){
    15                 a[i] -= ('Z' - 'A' + 1);
    16                 tmp = 1;
    17             }
    18             --i, --j;
    19         }
    20         else{
    21             a[i] = a[i] + tmp;
    22             tmp = 0;
    23             if(a[i] > 'Z'){
    24                 a[i] -= ('Z'-'A'+1);
    25                 tmp = 1;
    26             }
    27             --i;
    28 
    29         }
    30     }
    31     if(tmp){
    32         for(i = len1; i >= 0; --i)
    33             a[i+1] = a[i];
    34         a[0] = 'B';
    35     }
    36 
    37 }
    38 
    39 void outPut(char *a)
    40 {
    41     int len = strlen(a);
    42     bool flag = false;
    43     for(int i = 0; i < len; ++i){
    44         if(a[i] != 'A') flag = true;
    45         if(flag) printf("%c", a[i]);
    46     }
    47     if(!flag) puts("A");
    48     else puts("");
    49 }
    50 
    51 int main()
    52 {
    53     char arr1[210], arr2[210];
    54     int len1, len2;
    55     while(scanf("%s %s", arr1, arr2) != EOF)
    56     {
    57         len1 = strlen(arr1);
    58         len2 = strlen(arr2);
    59         if(len1 > len2){
    60             add(arr1, arr2);
    61             outPut(arr1);
    62         }
    63         else{
    64             add(arr2, arr1);
    65             outPut(arr2);
    66         }
    67     }
    68     return 0;
    69 }

    高精度到此完一段落了..其实还有几题没做..到时候再说吧~Hdu 1250 1297 1905

  • 相关阅读:
    Spring@Profile注解
    day 32 子进程的开启 及其用法
    day 31 udp 协议SOCK_DGRAM
    day 30 客户端获取cmd 命令的步骤
    day 29 socket 理论
    day 29 socket 初级版
    有关 组合 继承
    day 27 多态 接口 类方法 静态方法 hashlib 摘要算法模块
    新式类和经典类的区别
    day 28 hasattr getattr serattr delattr 和带__内置__ 类的内置方法
  • 原文地址:https://www.cnblogs.com/Griselda/p/2626903.html
Copyright © 2011-2022 走看看