zoukankan      html  css  js  c++  java
  • 九度OJ 1016:火星A+B (进制转换)

    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    提交:4913

    解决:1334

    题目描述:
        读入两个不超过25位的火星正整数A和B,计算A+B。需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数。例如:地球上的10进制数2,在火星上记为“1,0”,因为火星个位数是2进制的;地球上的10进制数38,在火星上记为“1,1,1,0”,因为火星个位数是2进制的,十位数是3进制的,百位数是5进制的,千位数是7进制的……
    输入:
        测试输入包含若干测试用例,每个测试用例占一行,包含两个火星正整数A和B,火星整数的相邻两位数用逗号分隔,A和B之间有一个空格间隔。当A或B为0时输入结束,相应的结果不要输出。
    输出:
        对每个测试用例输出1行,即火星表示法的A+B的值。
    样例输入:
    1,0 2,1
    4,2,0 1,2,0
    1 10,6,4,2,1
    0 0
    样例输出:
    1,0,1
    1,1,1,0
    1,0,0,0,0,0
    来源:
    2006年浙江大学计算机及软件工程研究生机试真题

    思路:

    此题题意不容易理解。涉及素数计算、进制转换等内容,属于比较综合的基础题。


    代码:

    #include <stdio.h>
    #include <math.h>
    #include <ctype.h>
    #include <string.h> 
    #include <stdlib.h>
        
    #define N 25
        
    int p[N+1];
        
    int isprime(int n)
    {       
        int i;
        for (i=2; i<=sqrt(n); i++)
        {
            if (n%i == 0)
                return 0;
        }
        return 1;
    }   
        
    void calcPrime() 
    {       
        int i;  
        int j; 
        p[0] = 2;
        j = 1;
        i = 3;
        while (j<=N+1)
        {
            while (!isprime(i))
                i++;
            p[j++] = i;
            i++;
        }
    }       
    
    void print(int a[])
    {
        int i;
        for (i=N; i>=0; i--)
        {
            if (a[i] != 0)
                break;
        }
        if (i < 0)
        {
            printf("0
    ");
            return;
        }
        printf("%d", a[i]);
        for (i--; i>=0; i--)
            printf(",%d", a[i]);
        printf("
    ");
    }
    
    void prase(char s[], int a[])
    {
        int i = 0;
        int j = 0;
        while (s[i])
        {
            a[j++] = atoi(s+i);
            while(isdigit(s[i]))
                i++;
            if (s[i] == ',')
                i++;
        }
        int tmp;
        for (i=0; i<j/2; i++)
        {
            tmp = a[i];
            a[i] = a[j-1-i];
            a[j-1-i] = tmp;
        }
        for (i=j; i<=N; i++)
            a[i] = 0;
    }
    
    void plus(int a[], int b[])
    {
        int i;
        for (i=0; i<=N; i++)
        {
            a[i] += b[i];
            //printf("p[%d]=%d
    ", i, p[i]);
            if (a[i] >= p[i])
            {
                a[i+1] ++;
                a[i] -= p[i];
            }
        }
    }   
            
    int main(void)
    {
        char s1[1000], s2[1000];
        int a[N+1], b[N+1];
    
        calcPrime();
        while (scanf("%s%s", s1, s2) != EOF)
        {
            if (strcmp(s1, "0") == 0 || strcmp(s2, "0") == 0)
                break;
            
            memset(a, 0, sizeof(a));
            memset(b, 0, sizeof(b));
            prase(s1, a);
            prase(s2, b);
        
            //print(a);
            //print(b);
            
            plus(a, b);
            print(a);
        }
        
        return 0;
    }


    编程算法爱好者。
  • 相关阅读:
    LeetCode 32. 最长有效括号(Longest Valid Parentheses)
    LeetCode 141. 环形链表(Linked List Cycle)
    LeetCode 160. 相交链表(Intersection of Two Linked Lists)
    LeetCode 112. 路径总和(Path Sum)
    LeetCode 124. 二叉树中的最大路径和(Binary Tree Maximum Path Sum)
    LightGBM新特性总结
    sql service 事务与锁
    C#泛型实例详解
    C# 中的委托和事件(详解)
    C# DateTime日期格式化
  • 原文地址:https://www.cnblogs.com/liangrx06/p/5084015.html
Copyright © 2011-2022 走看看