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;
    }


    编程算法爱好者。
  • 相关阅读:
    js正则表达式中的问号使用技巧总结
    380. Insert Delete GetRandom O(1)
    34. Find First and Last Position of Element in Sorted Array
    162. Find Peak Element
    220. Contains Duplicate III
    269. Alien Dictionary
    18. 4Sum
    15. 3Sum
    224. Basic Calculator
    227. Basic Calculator II
  • 原文地址:https://www.cnblogs.com/liangrx06/p/5084015.html
Copyright © 2011-2022 走看看