1 条题解

  • 0
    @ 2024-12-24 9:59:26

    C :

    /*
    题目描述
    
    读入两个不超过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的值。
    
    样例输入
    
    3,2,0 1,2,0
    0 0
    
    样例输出
    
    1,0,1,0
    
    
    
      1,1,1,1,1,1 3,2,1,1
    
    */
    
    //先将输入转译成两个数组
    //再通过给定的运算法则进行计算
    	//while
    	//对每一位进行三项操作:加上进位项,相加,判断是否进位,
    //输出
    
    //疑难:如何进行位的对齐操作?有没有可能进位超过1?
    #include <stdio.h>
    #include <string.h>
    
    int isZ(int a) //判断a是否为质数
    {
    	int i;
    	
    	for (i = 2; i < a; ++i) //可以再精简一些。。
    	{
    		if (a % i == 0) return 0;
    	}
    	return 1;
    }
    void getZ(int z[], int n)
    {
    	int i;
    	int cnt;
    
    	cnt = 0;
    	for (i = 2; cnt < n; ++i)
    	{
    		if (isZ(i))
    		{
    			z[cnt++] = i;
    		}
    	}
    
    }
    int getA(int a[], int n, char flag) //如果得到的值为0,返回0 ,否则返回长度//0,0,0算是零么?
    {
    	int i = 0;
    	int z = 1; //判断a是否为zero
    
    
    	do {
    		scanf("%d",a+i);
    		if (a[i] != 0)
    		{
    			z = 0;
    		}
    		++i;
    	}while(getchar() != flag && i < n); 
    
    	if (z) return 0;
    
    	return i; //默认i不可能为零
    }
    
    void add(int a[], int n1, int b[], int n2, int sum[]) //getSum的子函数,将a,b的各位加到sum,但不进位
    {
    	int i, j;
    
    	for (i = 0; i < (n1 - n2); ++i)
    	{
    		sum[i] = a[i];
    	}
    
    	for (i = (n1 - n2), j = 0; i < n1; ++i, ++j)
    	{
    		sum[i] = a[i] + b[j];
    	}
    
    }
    void verse(int a[], int n)//getSum子函数,将sum转置,使得sum从左到右位数变大
    {
    	int i;
    	int temp;
    
    	for (i = 0; i < n / 2; i++)
    	{
    		temp = a[i];
    		a[i] = a[n - 1 - i];
    		a[n - 1 - i] = temp;
    	}
    }
    int getSum(int a[], int n1, int b[], int n2, int sum[], int z[]) //进行计算,返回结果的位数
    {
    	int i;
    	int n;
    	int c;
    
    	n1 > n2 ? add(a,n1,b,n2,sum) : add(b,n2,a,n1,sum);//先把a,b的各个位加起来放到sum
    
    	n = n1 > n2 ? n1 : n2; //得到当前sum的长度
    
    	verse(sum, n);//将sum转置
    
    	c = 0;
    	for (i = 0; i < n || c > 0; ++i)//再对sum进行进位
    	{
    		sum[i] += c;
    		c = 0;
    		if (sum[i] >= z[i])
    		{
    			c = sum[i] / z[i];
    			sum[i] %= z[i];
    		}
    	}
    	
    	return i; //i 就是sum的长度。i可能大于n
    }
    
    void out(int sum[], int n) //输出
    {
    	int i;
    
    	for (i = n - 1; i >= 0; --i)
    	{
    		printf("%d", sum[i]);
    
    		if (i != 0)
    		{
    			printf(",");
    		}
    		else
    		{
    			printf("\n");
    		}
    
    	}
    }
    
    
    int main(void)
    {
    	
    	int z[30]; //质数序列
    	int a[30], b[30]; //两个加数,两个数为左对齐
    	int sum[30];		//和
    
    	int n1, n2;		//两个加数的长度
    	int n;			//和的长度
    
    	memset(z,0, sizeof(z));
    	getZ(z, 30);
    
    	while (1)
    	{
    		//初始化
    		memset(a, 0, 30 * sizeof(int));
    		memset(b, 0, 30 * sizeof(int));
    		memset(sum, 0, 30 * sizeof(int));
    
    		n1 = n2 = n = 0;
    
    		n1 = getA(a, 30, ' ');
    		n2 = getA(b, 30, '\n');
    
    		if (n1 == 0 && n2 == 0) break; //TODO 这里可能是&& 也可能是||
    
    		n = getSum(a, n1, b, n2, sum, z);
    
    		out(sum, n);
    
    	}
    
    	return 0;
    
    
    
    }
    /*
    1,1,1,1,1,2,3,4,234,5,2,43,23,23,1,1,1,12,43,2134,234,23,5,5,5 1,34,5,34,5,56,34,23,1,2,3,4,5,6,45,4,4,5,7,6,54,3
    1,1,1,1,1,1 23,2,3,4,34,2,3,23,23,4 2,345,34,2,3,4,4,5,3,2,2
    34,5,56,7,65,45,34 234,34,5,5,6,54,4,4,4,5,4,3
    0 1
    */
    
    
    
    

    C++ :

    #include <cstdio>
    #include <vector>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    #define N 30
    
    int prime[N];
    
    class Mars {
    public:
        Mars() {
            memset(a, 0, sizeof(a));
            n = 1;
        }
        void init(char *s) {
            vector < int > v;
            int len = strlen(s), x = 0;
            for (int i = 0; i < len; ++i)
                if (s[i] != ',') {
                    x = x * 10 + (s[i] - '0');
                } else {
                    v.push_back(x);
                    x = 0;
                }
            v.push_back(x);
            memset(a, 0, sizeof(a));
            n = v.size();
            for (int i = 0; i < n; ++i)
                a[i] = v[n - 1 - i];
        }
        bool isZero() {
            return 1 == n && 0 == a[0];
        }
        void writeln() {
            for (int i = n - 1; i > 0; --i)
                printf("%d,", a[i]);
            printf("%d\n", a[0]);
        }
        Mars operator + (const Mars & b) {
            Mars ret;
            ret.n = max(n, b.n);
            for (int i = 0; i < ret.n; ++i) {
                ret.a[i] += a[i] + b.a[i];
                if (ret.a[i] >= prime[i]) {
                    ret.a[i] -= prime[i];
                    ++ret.a[i + 1];
                }
            }
            if (ret.a[ret.n]) ++ret.n;
            return ret;
        }
    private:
        int a[N], n;
    };
    
    void init() {
        for (int i = 2, pn = 0; pn < N; ++i) {
            bool flag = true;
            for (int j = 0; j < pn && prime[j] * prime[j] <= i; ++j)
                if (i % prime[j] == 0) {
                    flag = false;
                    break;
                }
            if (flag)
                prime[pn++] = i;
        }
    }
    
    int main() {
        char sa[100], sb[100];
        Mars a, b, c;
        init();
        while (true) {
            scanf("%s %s", sa, sb);
            a.init(sa);
            b.init(sb);
            if (a.isZero() && b.isZero())
                break;
            c = a + b;
            c.writeln();
        }
        return 0;
    }
    
    
    • 1

    信息

    ID
    1472
    时间
    1000ms
    内存
    32MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者