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


    编程算法爱好者。
  • 相关阅读:
    VUE中is的作用
    lable便签 for的作用
    Java第五课
    Java第四课课后作业
    Java第四课
    Unit6Java运算符
    Unit5Java数据类型
    Unit4如何使用类
    Java如何设计并编写类
    IDEA安装Alibaba,SonarLint代码规范检查插件
  • 原文地址:https://www.cnblogs.com/liangrx06/p/5084015.html
Copyright © 2011-2022 走看看