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

  • 相关阅读:
    UVa 1354 天平难题 (枚举二叉树)
    广西邀请赛总结
    UVa 12118 检查员的难题 (dfs判连通, 构造欧拉通路)
    UVA
    Uva 127 "Accordian" Patience (模拟)
    UVA 10539 Almost Prime Numbers( 素数因子)
    HDU 1272 小希的迷宫(并查集)
    HDU 1213 How Many Tables (并查集)
    POJ 2236 Wireless Network(并查集)
    HDU 1233 还是畅通工程 ( Kruskal或Prim)
  • 原文地址:https://www.cnblogs.com/Griselda/p/2626903.html
Copyright © 2011-2022 走看看