首页 > 试题广场 >

火星A+B

[编程题]火星A+B
  • 热度指数:4452 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
    读入两个不超过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之间有一个空格间隔。


输出描述:
    对每个测试用例输出1行,即火星表示法的A+B的值。
示例1

输入

1,0 2,1

输出

1,0,1
示例2

输入

4,2,0 1,2,0

输出

1,1,1,0
示例3

输入

1 10,6,4,2,1

输出

1,0,0,0,0,0
还是一样的思想,先转化为10进制,再转化为我们想要的
//这题都不用判断字母了??白白多写了。。
#include <bits/stdc++.h>

using namespace std;

int arr[30]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};

int Compute(string str)
{
	vector<int>myvector;
	int a=0;
	int b=str.find(",",a+1);
	while(b!=string::npos)
	{
		myvector.push_back(atoi(str.substr(a+1,b-a-1).c_str()));
		a=b;
		b=str.find(",",a+1);
	}
	int answer=0;
	for(int i=0;i<myvector.size();i++)
	{
		answer=answer*arr[myvector.size()-i-1];
		answer+=myvector[i];
	}
	return answer;
}


int main()
{ 
	string str1,str2;
	while(cin>>str1>>str2)
	{
		if(str1=="0"&&str2=="0") break;
		str1=","+str1+",";
		str2=","+str2+",";
        //将输入转化为10进制
		int A=Compute(str1);
		int B=Compute(str2);
		int n=A+B;
		//下面把10进制转化为其他
		int k=0;
		vector<int>answer;
		while(n!=0)
		{
			answer.push_back(n%arr[k]); 
			n/=arr[k];
			k++;
		}
		reverse(answer.begin(),answer.end());
		cout<<answer[0];
		for(int i=1;i<answer.size();i++)
		{
			cout<<","<<answer[i];
		}
		cout<<endl; 
	}
	return 0;	
} 

发表于 2020-03-31 18:40:44 回复(0)
#include <bits/stdc++.h>
using namespace std;
const int AX = 1e2 + 6 ;
char a[AX],b[AX];
vector<int>p ;
vector<int>v[5] ;
void get_prime(){
	for( int i = 2 ; ; i++ ){
		if( p.size() == 30 ) break ; 
		int len = sqrt(i) + 1 , f = 1 ; 
		for( int j = 2 ; j < len ; j++ ){
			if( i % j == 0 ){
				f = 0 ;
				break ;
			}
		}if( f ) p.push_back(i);
	}
}
int main() {
	get_prime();
	while( ~scanf("%s%s",a,b) ) {
		if( !strcmp(a,"0") && !strcmp(b,"0") ) break;
		char *s = strtok( a , "," ); 
		v[0].clear();
		v[1].clear();
		while( s ){
			v[0].push_back( atoi(s) ) ;
			s = strtok( NULL , "," );
		}
		s = strtok( b , "," ) ;
		while( s ) {
			v[1].push_back( atoi(s) );
			s = strtok( NULL , "," );
		}
		reverse( v[0].begin() , v[0].end() );
		reverse( v[1].begin() , v[1].end() );
		 
		int id = ( v[0].size() > v[1].size() ? 0 : 1 ) ;
		for( int j = 0 ; j < v[!id].size() ; j++ ){
			v[id][j] += v[!id][j] ;
		}
		int c = 0 ; 
		int len = v[id].size();
		for( int i = 0 ; i < len ; i++ ){
			int t = ( c + v[id][i] ) / p[i] ;
			v[id][i] = ( c + v[id][i] ) % p[i] ;
			c = t ;
		}
		if( c ) v[id].push_back(c);
		for( int i = v[id].size() - 1 ; i >= 0 ; i-- ){
			printf("%d",v[id][i]);
			if( i ) printf(",");
		}printf("\n"); 
	}
	return 0 ;
}

发表于 2020-03-28 12:08:04 回复(0)
//first,define a single-digit adder in which you can define the scale
//second, scan mars integer A and B, call the adder to add one by one from low to high.
#include <iostream>
#include <string.h>

using namespace std;

int prime[25] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 };

int MyAdd(int a, int b, int &c, int scale)
{
    int s = a + b + c;
    c = s / scale;
    return s % scale;
}

int main()
{
    string strA, strB;
    while (cin>>strA>>strB && "0" != strA && "0" != strB)
    {
        int a = 0, b = 0, c = 0, ft = 1, count = 0, sum[26] = { 0 };
        for (int i = strA.size() - 1, j = strB.size() - 1; i >= 0 or j >= 0; --i, --j)
        {
            a = 0; ft = 1;
            while (i >= 0 && ',' != strA[i])
            {
                a += (strA[i] - '0') * ft;
                ft *= 10;
                --i;
            }
            b = 0; ft = 1;
            while (j >= 0 && ',' != strB[j])
            {
                b += (strB[j] - '0') * ft;
                ft *= 10;
                --j;
            }
            
            sum[count++] = MyAdd(a, b, c, prime[count]);
        }

        if (c > 0) sum[count++] = c;

        while (count-- > 1) cout << sum[count] << ",";
        cout << sum[0] << endl;
    }
    return 0;
}
发表于 2020-02-18 23:48:44 回复(0)
先用素数筛法获取素数表,然后进行大数加法,进位的时候注意一下
#include <stdio.h>
#include <string.h>
#define N 30
#define M 300

int prime[M], primeSize=0;//素数表、素数个数
bool mark[M];//false表示这个数字没有被访问过
int a[N], b[N];//两个大数

void Add(int a[N], int b[N])
{//计算两个大数之和并输出
    for(int i=0; i<N; i++)
    {
        a[i]+=b[i];
    }
    for(int i=0; i<N-1; i++)
    {
        if(a[i]>=prime[i])
        {
            a[i+1]+=a[i]/prime[i];
            a[i]=a[i]%prime[i];
        }
    }
    int high=N-1;
    while(high>0&&a[high]==0) high--;
    printf("%d", a[high]);
    for(int i=high-1; i>=0; i--) printf(",%d", a[i]);
    printf("\n");
}

void GetNum(char str[M])
{//从字符串中获取两个大数的信息
    for(int i=0; i<N; i++) a[i]=b[i]=0;
    int pos=0;
    int pa=0, pb=0;
    int len=strlen(str);
    while(str[pos]!=' ')
    {
        if(str[pos]==',')
        {
            pos++;
            pa++;
        }
        a[pa]=a[pa]*10+(str[pos]-'0');
        pos++;
    }
    pos++;
    while(pos<len)
    {
        if(str[pos]==',')
        {
            pos++;
            pb++;
        }
        b[pb]=b[pb]*10+(str[pos]-'0');
        pos++;
    }
    int sa=0, sb=0;
    while(pa>sa)
    {
        int temp=a[pa];
        a[pa]=a[sa];
        a[sa]=temp;
        pa--;
        sa++;
    }
    while(pb>sb)
    {
        int temp=b[pb];
        b[pb]=b[sb];
        b[sb]=temp;
        pb--;
        sb++;
    }
}

bool TimeToSayGoodbye(int a[N], int b[N])
{//判断是否跳出循环结束程序
    for(int i=0; i<N; i++)
    {
        if(a[i]!=0 || b[i]!=0) return false;
    }
    return true;
}

int main()
{
    for(int i=0; i<M; i++) mark[i]=false;
    for(int i=2; i<M; i++)
    {
        if(mark[i]==false) prime[primeSize++]=i;
        else continue;
        if(primeSize>=N) break;//不用记录那么多的素数
        for(int j=i*i; j<M; j+=i)
        {
            mark[j]=true;
        }
    }
    char str[M];
    while(gets(str))
    {
        GetNum(str);
        if(TimeToSayGoodbye(a, b)) break;
        Add(a, b);
    }
    return 0;
}

编辑于 2018-03-08 23:06:10 回复(0)
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
//对于不确定的数一定要赋值
using namespace std;
int x[30],y[30];
int res[30];
int prime[25]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};

int main()
{
    string a,b;
    int j=0,k=0;
    while(cin>>a>>b&&a!="0"&&b!="0"){
         memset(x,0,sizeof(x));
         memset(y,0,sizeof(y));
         j=0,k=0;
         for(int i=0;i<a.size();i++){
              if(a[i]==',')
                 j++;
              else
              x[j]=x[j]*10+a[i]-'0';
         }
         for(int i=0;i<b.size();i++){
              if(b[i]==',')
                 k++;
              else
              y[k]=y[k]*10+b[i]-'0';
         }
         reverse(x,x+j+1);
         reverse(y,y+k+1);
         int len = max(j,k)+1;
         for(int i=0;i<=len;i++){
            res[i] = x[i]+y[i];
         }

         for(int i=0;i<len;i++){
            if(res[i]>=prime[i]){
                res[i]-=prime[i];
                res[i+1]+=1;
                if(i==len-1)
                len =len+1;
            }
         }
         for(int i=len-1;i>0;i--)
            cout<<res[i]<<",";
            cout<<res[0]<<endl;
    }
    return 0;
}

这是一道模拟题,居然被坑了。理解题目意思非常重要。

编辑于 2017-03-14 13:55:28 回复(3)
//唯一能看懂的C语言答案--2020.1.20
#include<stdio.h>
#include<string.h>
#define N 65
int p[26]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101};
void sc_sum(int s[], char c[])
{
	int js=0, ji=1, flag=0, i;
	for(i=strlen(c)-1; i>=0; i--)	//对c倒着数,正着存入s中 
	{
		if(c[i]!=',')
		{
			js+=(c[i]-'0') *ji;
			ji*=10;
		}
		if(c[i]==','||i==0)		//如果遇到','存入s,开始下个数据
		{						//考虑到开头前边没',' 
			s[flag++]+=js;
			js=0;
			ji=1;
		}
	}
}
int main()
{
	char c1[N], c2[N];
	int s[N/2], i;
	while(scanf("%s%s", c1, c2), c1[0]!='0', c2[0]!='0')
	{
		memset(s, 0, sizeof(s));
		sc_sum(s, c1);
		sc_sum(s, c2);
		int sum, j;
		for(i=0; i<N/2; i++)
		{
			s[i+1]+=s[i]/p[i];
			s[i]%=p[i];
			sum=0;			//如果后面都是0,停止循环,
			for(j=i+1; j<N/2; j++)	
			sum+=s[j];	
			if(sum==0)		//此时i为最后一个数字的下标 
			break;		
		}
		for(; i>=1; i--)	//逆序输出,从最高位到最低位 
			printf("%d,", s[i]);
		printf("%d\n", s[0]);
		memset(c1, '0', sizeof(c1));
		memset(c2, '0', sizeof(c2));
	}
	return 0;
}
编辑于 2020-02-07 15:11:15 回复(0)
这挺简单的,加法嘛。从低位开始相加,中间一直带一个进位。(^__^) 嘻嘻……
while True:
    try:
        primeNum = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
        a,b = input().split()
        if a=='0' or b == '0':
            break
        a = list(map(int,a.split(',')[::-1]))  #以逗号分隔后反转数组
        b = list(map(int,b.split(',')[::-1]))
        if len(a) > len(b):                    #保持数组a比较短
            a,b = b,a 
        result = []
        carry = 0
        for i in range(len(a)):                #循环数组a,此时a、b和进位carry相加
            carry,temp = divmod(a[i]+b[i]+carry,primeNum[i])
            result.insert(0,temp)              #在数组前面插入数,(也可以在后面加入数,之后反转输出)
        for i in range(len(a),len(b)):         #循环剩余的数组b,此时b和进位carry相加
            carry, temp = divmod(b[i] + carry, primeNum[i])
            result.insert(0, temp)
        if carry != 0:                         #最高一位如果有进位,则加进去。
            result.insert(0,carry)
        print(",".join(map(str,result)))
    except Exception:
        break
编辑于 2018-09-25 17:06:27 回复(0)
package com.speical.first;

import java.util.Scanner;

/** 
* 火星A + B
* 
* 素数打表 + 大数相加
* 
* 注意此题的数每一位可能超过一位
* 所以相加时不能用以往的char数组
* 老老实实用int数组省事
* 
* 期待大家的优化
* @author special
* @date 2018年1月6日 上午11:48:29
*/
public class Pro123 {
    static final int SIZE = 30;
    static int[] prime = new int[SIZE];

    public static boolean isPrime(int num){   //判断是否是素数
        for(int i = 2; i <= Math.sqrt(num); i++){
            if(num % i == 0){
                return false;
            }
        }
        return true;
    }

    public static void init(){  //获得前29个素数
        int index = 1;
        for(int n = 2; index < SIZE; n++){
            if(isPrime(n)){
                prime[index++] = n;
            }
        }
    }

    public static int[] convertInt(String str){ //输入的火星文转换成int数组,数的低位对应数组的高位
        String[] nums = str.split(",");
        int[] num = new int[nums.length];
        int temp;
        for(int i = 0; i < nums.length; i++){
            temp = 0;
            for(int j = 0; j < nums[i].lengt***emp = temp * 10 + nums[i].charAt(j) - '0';
            }
            num[i] = temp;
        }
        return num;
    }
    public static void add(String A, String B){ // 火星文相加
        int[] num1 = convertInt(A);
        int[] num2 = convertInt(B);
        int[] result = new int[Math.max(num1.length, num2.length) + 1]; //结果的数组大小最大为相加两个数的最大 + 1
        int index = result.length, carry = 0, temp, redix = 1;
        for(int i = num1.length - 1, j = num2.length - 1; i >= 0 || j >= 0; i--, j--){
            temp = (i >= 0 ? num1[i] : 0) + (j >= 0 ? num2[j] : 0) + carry;
            carry = temp / (prime[redix]);
            temp %= prime[redix++];
            result[--index] = temp;
        }
        if(carry > 0){
            result[--index] = carry;
        }
        boolean flag = true;
        for(int i = index; i < result.length; i++){  // 根据结果数组打印
            System.out.print((flag ? "" : ",") + result[i]);
            flag = false;
        }
        System.out.println();
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        init();
        Scanner input = new Scanner(System.in);
        while(input.hasNext()){
            String A = input.next();
            String B = input.next();
            if(A.equals("0") || B.equals("0")) break;
            add(A, B);
        }
    }    

}
发表于 2018-01-06 13:44:06 回复(0)
不明白为什么我自己电脑运行的结果和题上给的示例结果是一样的,但是在它系统上运行的结果差别很大!!
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <math.h> 
using namespace std;

int stringToInt(string s){
	int num;
	for (int i=0; i<s.size(); ++i) {
    	num = 10 * num + (s[i] - '0');
	}
	return num;
}

vector<int> split(string s){
	string str;
	vector<int> nums;
	for(int i=0;i<s.size();i++){
		if(s[i]==','){
			int tempNum = stringToInt(str);
			nums.push_back(tempNum);
			str = "";
			continue;
		}
		str.push_back(s[i]);
	}
	int tempNum = stringToInt(str);
	nums.push_back(tempNum);
	return nums;
}

// 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97
int main(){
	int quan[] = { 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97 };
	int carry = 0; // 进位 
	int index = 0; // 权位 
	vector<int> result;
	string num1 = "1";
	string num2 = "10,6,4,2,1";
	cin >> num1;
	cin >> num2;
	vector<int> v1 = split(num1);
	vector<int> v2 = split(num2);
	int length1 = v1.size()-1;
	int length2 = v2.size()-1;
	
	while(length1>=0 || length2>=0 || carry!=0){
		int c1 = length1>=0 ?  v1[length1] : 0;
		int c2 = length2>=0 ?  v2[length2] : 0; 
		int currentNum = c1 + c2 + carry;
		carry =  currentNum / quan[index];
		result.push_back(currentNum%quan[index]);
		index++;
		length1--;
		length2--;
	}
	string resultString = ""; 
	for(int i=result.size()-1;i>=0;i--){
		if(i==0){
			resultString += to_string(result[i]);
		}else{
			resultString += to_string(result[i]);
			resultString += ",";
		}
	}
	cout <<  resultString;
}

发表于 2024-03-22 17:24:47 回复(0)
#include <iostream>
#include <cmath>
#include <vector>
#include <string>
using namespace std;

vector<int> prime;

void Initial(){    //求前25个素数
    for(int i=2; prime.size()<25; ++i){
        int j;
        for(j=sqrt(i); j>=2; --j){
            if(i%j==0){
                break;
            }
        }
        if(j==1) prime.push_back(i);
    }
    return;
}

int Prime_factorial(int k){    //素数阶乘
    int res=1;
    for(int i=0; i<k; ++i){
        res *= prime[i];
    }
    return res;
}

int Transit(string str){    //火星数转换为十进制数
    int sum, k=0;
    if(str[str.size()-1]-'0'==0) sum=0;
    else sum=1;
    for(int i=str.size()-3; i>=0; i-=2){
        int temp = str[i] - '0';
        for(int j=1; str[i-1]>='0' && str[i-1] <='9'; ++j, --i){
            temp += (str[i-1]-'0') * pow(10,j);
        }
        ++k;
        sum += temp * Prime_factorial(k);
    }
    return sum;
}

void solve(int num){    //十进制数转火星数
    vector<int> res;
    for(int i=0; num!=0; ++i){
        res.push_back(num % prime[i]);
        num /= prime[i];
    }
    for(int i=res.size()-1; i>=1; --i){
        cout << res[i] << ',';
    }
    cout << res[0];
    return;
}

int main(){
    Initial();
    string str1, str2;
    while(cin >> str1 >> str2){
        int sum = Transit(str1) + Transit(str2);
        solve(sum);
    }
    return 0;
}

发表于 2024-03-09 19:22:48 回复(0)
#include <array>
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <istream>
#include <ostream>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;

vector<int>prime;   //素数数组

bool isPrime(int n) {   //判断是否为素数
    if (n < 2) {
        return false;
    }
    int bound = sqrt(n);    //判断边界
    for (int i = 2; i <= bound; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

void initial() {    //初始化prime数组
    for (int i = 2; prime.size() < 25; i++) {
        if (isPrime(i)) {
            prime.push_back(i);
        }
    }
}

struct MarsInteger {
    int* digit; //数组表示各位(数组长度为25)
    int digitNum = 0;   //位数
    MarsInteger() {     //构造函数
        digit = new int[25]();  //初始化数组
    }
    MarsInteger operator+(const MarsInteger& x) {   //重载加法
        MarsInteger answer;
        int carry = 0;
        for (int i = 0; i < digitNum || i < x.digitNum; i++) {
            int current = digit[i] + x.digit[i] + carry;
            carry = current / prime[i];
            answer.digit[answer.digitNum++] = current % prime[i];
        }
        if (carry) {
            answer.digit[answer.digitNum++] = carry;
        }
        return answer;
    }
};

istream& operator>>(istream& in, MarsInteger& x) {  //重载输入流运算符
    string str;
    in >> str;
    istringstream sstream(str);
    stack<string>myStack;
    while (getline(sstream, str, ',')) {
        myStack.push(str);
    }
    while (!myStack.empty()) {
        x.digit[x.digitNum++] = atoi(myStack.top().c_str());
        myStack.pop();
    }
    return in;
}

ostream& operator<<(ostream& out,
                    const MarsInteger& x) {   //重载输出流运算符
    for (int i = x.digitNum - 1; i >= 0; i--) {
        out << x.digit[i];
        if (i > 0) {
            out << ",";
        }
    }
    return out;
}

int main() {
    initial();
    MarsInteger a, b;
    while (cin >> a >> b) {
        cout << a + b << endl;
    }
    return 0;
}

发表于 2024-03-02 19:17:09 回复(0)
算法使用的是转换火星数到自然数的方式 
算法未通过,猜测可能是大数原因,运行超时 仅供参考!!!
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int prime[25] = {2, 3, 5, 7, 11, 13, 17, 19, 23,
                 29, 31, 37, 41, 43, 47,
                 53, 59, 61, 67,
                 71, 73, 79, 83, 89, 97
                };//储存25个素数
//定义一个火星数到10进制数的函数
long long mars_to_earth(char* s) {
    long long res = 0; // 存储结果
    int len = strlen(s); // 字符串长度
    int i = len - 1; // 字符串下标
    int j = -1; // 素数数组下标
    long long weight = 1; // 存储当前的权重
    while (i >= 0) {
        if (s[i] == ',') { // 遇到逗号跳过
            i--;
            continue;
        }
        j++; // 素数数组下标加一
        res += (s[i] - '0') * weight; // 将当前位乘以对应的素数并累加到结果中
        i--; // 字符串下标减一
        weight *= prime[j]; // 权重乘以对应的素数
    }
    //cout<<res<<endl;
    return res; // 返回结果
}
//定义一个到火星数的函数
void earth_to_mars(long long n) {
    char s[100]; // 存储结果字符串
    int i = -1; // 字符串下标
    int j = -1; // 素数数组下标
    while (n > 0) {
        j++; // 素数数组下标加一
        s[++i] = n % prime[j] +
                 '0'; // 将当前余数转换为字符并存入字符串中
        n /= prime[j]; // 将当前商继续除以对应的素数
        if (n > 0) s[++i] =
                ','; // 如果还有剩余,则在字符串中添加逗号分隔符
    }
    s[++i] = '\0'; // 在字符串末尾添加结束符
    for (int k = i - 1; k >= 0; k--) {
        printf("%c", s[k]);
    }//倒序输出字符数组
   
}
int main() {
    char a[100], b[100];
    while (scanf("%s %s", a, b)) {
        //if ((strcmp(a, "0") == 0 && strcmp(b, "0") == 0)) break; 如果a, b都为0 不输出
        long long x = mars_to_earth(a);
        long long y = mars_to_earth(b);
        earth_to_mars(x + y);
    }
    return (0);
}
发表于 2023-03-11 10:55:57 回复(0)
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    int arra[51];//火星A
    int arrb[51];//火星B
    for(int i=0;i<51;i++){//-1表示逗号
        arra[i]=-1;
        arrb[i]=-1;
    }
    //读入
    int a=0;
    int b=0;
    while(true){
       // cin>>arra[a];
       scanf("%d",&arra[a]);

        if(getchar()==' '){//遇到空格跳出,输入下一个
            break;
        }
        else
        a=a+2;//a和b分别表示arra和arrb数组下标。偶数位为有效数,奇数位为逗号
    }
    while(true){
        // cin>>arra[a];
        scanf("%d",&arrb[b]);

        if(getchar()=='\n'){//遇到换行表示输入结束
            break;
        }
        else
            b=b+2;
    }

    //变-1为0;
    int a1=50;
    int b1=50;
    while(arra[a1]==-1){//将无效逗号变为0;
        arra[a1]=0;
        arra[a1-1]=0;
        a1=a1-2;

    }
    while(arrb[b1]==-1){//将无效逗号变为0;
        arrb[b1]=0;
        arrb[b1-1]=0;
        b1=b1-2;

    }
    //倒置arra(A)和arrb(B),从尾数相加
    int s[25];//存arr6a数组有效数字,
     int s1=0;//s数组下标
    //复制arra数组到是s。
    for(int i=a1;i>=0;i=i-2){
        s[s1]=arra[i];
        s1++;
    }
    //粘贴从s数组再粘贴到arra数组
     s1=0;
    for(int i=0;i<=a1;i=i+2){
        arra[i]=s[s1];
        s1++;
    }
    //复制arrb数组到是s。
     s1=0;
    for(int i=b1;i>=0;i=i-2){
        s[s1]=arrb[i];
        s1++;
    }
    //粘贴从s数组再粘贴到arrb数组
     s1=0;
    for(int i=0;i<=b1;i=i+2){
        arrb[i]=s[s1];
        s1++;
    }
    //求素数,从尾数求和
    int arr[25]={2,3,5,7,11,13,17,19,23,27,29,31,37,41,43,47,51,53,59,61,67,71,73,79,83};//素数数组
    for(int i=0,j=0;i<=50;i=i+2,j++){//i表示arra和arrb数组下标。j表示arr素数下标
       
            if ((arra[i] + arrb[i]) < arr[j]) {//小于直接相加,存入arra数组
                arra[i] = arra[i] + arrb[i];

            } else {//大于或等于先进位再相加
                arra[i + 2]++;
                arra[i] = arra[i] + arrb[i] - arr[j];
            }

    }
    //测长度
    s1=50;//s1表示非0,即有效位的数组下标
    while(arra[s1]==0){
        s1=s1-2;
    }
    for(int i=1;i<s1;i=i+2){//奇数位加逗号,
        if(arra[i]!=-1)
            arra[i]=-1;
    }

    int s2=0;//将s数组置空用于,再次倒置即高位在前输出。也可直接逆序输出
    for(int i=0;i<25;i++){
        s[i]=0;
    }
    //复制
    for(int i=s1;i>=0;i=i-2){//
        s[s2]=arra[i];
        s2++;
    }
    //粘贴
    s2=0;
    for(int i=0;i<=s1;i=i+2){
        arra[i]=s[s2];
        s2++;
    }
    //输出
    for(int i=0;i<=s1;i++){
        if(arra[i]==-1)//逗号
            printf(",");
        else
            printf("%d",arra[i]);//有效位
    }

}
发表于 2023-03-04 11:43:45 回复(0)
还是字符串加法那一套,不够它位与位之间是用‘,’隔开,所以每一位可以有很多个数,所以我用的是一个vector来存,然后再实现两个vector的加法,打印输出
#include <cmath>
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
//生成素数
int prime[25];
bool isprime(int n){
    int m=sqrt(n);
    for(int i=2;i<=m;i++){
        if(n%i==0){
            return false;;
        }
    }
    return true;
}
void initial(){
    int j=0;
    for(int i=2;j<25;i++){
        if(isprime(i)){
            prime[j]=i;
            j++;
        }
    }
}

//返回的vector顺序是反方向的
vector<int> strAdd(vector<int> s1,vector<int> s2){
    while(s1.size()<s2.size()){
        s1.insert(s1.begin(),0);
    }
    while(s2.size()<s1.size()){
        s2.insert(s2.begin(),0);
    }

    vector<int> s;
    
    int carry=0;
    for(int i=s1.size()-1,k=0;i>=0;i--,k++){
        int temp=s1[i]+s2[i]+carry;
        s.push_back(temp%prime[k]);
        carry=temp/prime[k];
    }
    if(carry!=0){
        s.push_back(carry);
    }
    
    return s;
}

int main() {
    initial();        
    vector<int> s1,s2;
    //使用一个向量指针方便输入两个不同向量;
    vector<int>* temp=&s1;
    int n;char c;
    while(scanf("%d%c",&n,&c)!=-1){
        (*temp).push_back(n);
        if(c=='\n'){
            break;
        }else if(c==' '){
            temp=&s2;
        }
    }
    //两向量相加
    vector<int> s=strAdd(s1,s2);
    for(int i=s.size()-1;i>0;i--){
        cout<<s[i]<<",";
    }
    cout<<s[0]<<endl;
}



发表于 2023-02-19 13:30:37 回复(0)
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int odd[] = { 2,3,5,7,11,13,17,19 };
vector<int> vec;

int substring2int(string x, int from, int to)
{
	int ans = 0;
	for (int i = from; i < to; i++)
	{
		ans = ans * 10 + (x[i] - '0');
	}
	return ans;
}

void string2int(string x)
{
	vec.clear();
	int from = 0;
	for (int i = 0; i < x.length(); i++)
	{
		if (x[i] == ',')
		{
			vec.push_back(substring2int(x, from, i));
			from = i + 1;
		}
		else if (i == x.length() - 1)
			vec.push_back(substring2int(x, from, i+1));
	}
}

int mar2int(string x)
{
	int ans = 0, j = 0;
	string2int(x);
	for (int i = 0; i < vec.size(); i++)
	{
		ans = ans * odd[vec.size() - 1 - i] + vec[i];
	}
	return ans;
}

void int2mar(int x)
{
	string ans;
	int i = 0;
	while (x)
	{
		ans.push_back('0' + x % odd[i]);
		x /= odd[i];
		i++;
	}
	for (int i = ans.length() - 1; i >= 0; i--)
	{
		if (i == ans.length() - 1)
			printf("%d", ans[i] - '0');
		else
			printf(",%d", ans[i] - '0');
	}
}

int main()
{
	string a, b;
	while (cin >> a >> b)
	{
		vec.clear();
		if (a == "0" || b == "0")
			break;
		int e_a = mar2int(a);
		int e_b = mar2int(b);
		int2mar(e_a + e_b);
	}
	return 0;
}

发表于 2022-02-09 15:30:59 回复(0)
#include<iostream>
#include<string>
#include<vector>
#include<math.h>
using namespace std;
bool isPirmer(int n) { //判断素数
	for (int i = 2; i <= sqrt(n); i++) {
		if (n % i == 0)
			return false;
	}
	return true;
}
void arrayab(string s, vector<int>& vec) {//将a,b转换成int
	string out = "";
	for (int i = s.length() - 1; i >= 0; i--) {
		if (s[i] != ',')
			out = s[i] + out;
		else {
			vec.push_back(stoi(out));
			out = "";
		}
	}
	vec.push_back(stoi(out));
}
int main() {
	int primer[25]; //a,b最大25位
	int sum = 2;
    //获取前25个素数
	for (int i = 0; i < 25;) {
		if (isPirmer(sum)) 
			primer[i++] = sum;
		sum++;
	}
	string a, b;
	while (cin >> a >> b) {
		if (a == "0" || b == "0")
			break;	
		vector<int> arrayA, arrayB;
		arrayab(a, arrayA);
		arrayab(b, arrayB);
        //转换a,b
		vector<int>::iterator ite1 = arrayA.begin();
		vector<int>::iterator ite2 = arrayB.begin();
		string outstring = "";
		int temp = 0; //判断执行到第几位数
		int carry = 0;//进位符
		while (ite1 != arrayA.end() || ite2 != arrayB.end()) {
			while (ite2 == arrayB.end() && ite1 != arrayA.end()) {
				outstring = "," + to_string((*ite1 + carry) % primer[temp]) + outstring;
				*ite1 + carry >= primer[temp] ? carry = 1 : carry = 0;
				ite1++;
				temp++;
			}
			while (ite2 != arrayB.end() && ite1 == arrayA.end()) {
				outstring = "," + to_string((*ite2 + carry) % primer[temp]) + outstring;
				*ite2 + carry >= primer[temp] ? carry = 1 : carry = 0;
				temp++;
				ite2++;
			}
			if (ite2 == arrayB.end() && ite1 == arrayA.end())
				break;
			outstring = "," + to_string((*ite1 + *ite2 + carry) % primer[temp]) + outstring;
			*ite1 + *ite2 + carry >= primer[temp] ? carry = 1 : carry = 0;
			ite1++;
			ite2++;
			temp++;
		}
		if (carry == 1)
			outstring = "1" + outstring;
		else
			outstring = outstring.substr(1);
		cout << outstring << endl;
	}
}

发表于 2021-08-18 15:01:20 回复(0)
#include<iostream>
#include<string.h>
#include<cmath>
using namespace std;
int jin[25]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
int main(){
    int x[30],y[30];
    string a,b;
    while((cin>>a>>b)&&a[0]!='0'&&b[0]!='0'){
        memset(x,0,sizeof(x));
        memset(y,0,sizeof(y));
        int numA=0,numB=0;
    
        for(int i=0;i<a.size();i++){
            if(a[i]==','){
                continue;
            }else{
                int all=0;
                while(1){
        
                    all = all*10 + (a[i]-'0');
                    i++;
                    if(a[i]==','||i>=a.size()){
                        i--;
                        break;
                    }
                    
                }
                x[numA++]=all;    
            }    
        }
        
        for(int i=0;i<b.size();i++){
            if(b[i]==','){
                continue;
            }else{
                int all=0;
                while(1){
        
                    all = all*10 + (b[i]-'0');
                    i++;
                    if(b[i]==','||i>=b.size()){
                        i--;
                        break;
                    }
                    
                }
                y[numB++]=all;    
            }    
        }
    
        //倒置 
        for(int i=0;i<numA/2;i++){
            x[i]^=x[numA-i-1];
            x[numA-i-1]^=x[i];
            x[i]^=x[numA-i-1];
        
        for(int i=0;i<numB/2;i++){
            y[i]^=y[numB-i-1];
            y[numB-i-1]^=y[i];
            y[i]^=y[numB-i-1];
        
    //    for(int i=0;i<numA;i++){
    //        cout<<x[i]<<",";
    //    }
    //    cout<<endl;
    //    for(int i=0;i<numB;i++){
    //        cout<<y[i]<<",";
    //    }    
        //加法进位
        int maxn = max(numA,numB)+1;
        int res[10];
        int carry=0;
        for(int i=0;i<maxn;i++){
            res[i]=carry+x[i]+y[i];
            carry=res[i]/jin[i];
            res[i]=res[i]%jin[i];
        
        //倒置输出 
        for(int i=maxn-1;i>=0;i--){
            if(res[i]==0&&i==maxn-1){
                continue;
            }else if(i!=0){
                cout<<res[i]<<",";
            }else{
                cout<<res[i]<<endl;
            }
        }
    }
    
    return 0;

发表于 2021-04-14 00:43:46 回复(0)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<vector>

using namespace std;

int prime[26];
int x[26], y[26];

bool check(int n){
    for(int i=2; i<=sqrt(n); i++){
        if(n%i == 0){
            return false;
        }
    }
    return true;
}

void setPrime(){
    int i=2;
    int count = 0;
    while(count < 26){
        if(check(i)){
            prime[count] = i;
            count++;
        }
        i++;
    }
}

int main(){
    setPrime();
    string a, b;
    while(cin>>a>>b&&a!="0"&&b!="0"){
        memset(x, 0, sizeof(x));
        memset(y, 0, sizeof(y));
        int j=0, k=0;
        for(int i=0; i< a.size(); i++){
            if(a[i] == ','){
                j++;
            }else{
                x[j] = x[j]*10+a[i]-'0';
            }
        }
        for(int i=0; i< b.size(); i++){
            if(b[i] == ','){
                k++;
            }else{
                y[k] = y[k]*10+b[i]-'0';
            }
        }
        reverse(x, x+j+1);
        reverse(y, y+k+1);

        int len = max(j, k)+1;
        int i=0;
        vector<int> z;
        int t=0;
        while(i< len || t!=0){
            int sum = x[i]+y[i]+t;
             z.push_back(sum%prime[i]);
             t = sum/prime[i];
             i++;
        }
        for(vector<int>::reverse_iterator i = z.rbegin(); i!=z.rend(); i++){
            if(i!=z.rbegin()){
                cout << ',';
            }
            cout << (*i);
        }
        cout << endl;
    }

    return 0;
}

发表于 2021-03-15 21:42:54 回复(0)
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while (sc.hasNext()) {
            String s = sc.nextLine();
            if (s.startsWith("0")) break;
            String[] ss = s.split(" ");
            String[] Aarray = ss[0].split(",");
            String[] Barray = ss[1].split(",");
            int A = 0, B = 0;

            //求素数
            ArrayList<Integer> primeNum = new ArrayList<>();
            primeNum.add(1);
            for (int i = 0; i < 20; i++) {
                if (isPrim(i)) primeNum.add(i);
            }
            int[] base = new int[primeNum.size()];
            //38=1*(5*3*2*1)+1*(3*2*1)+1*(2*1)+0*(1)
            //base[0]=1,base[1]=2*1,base[2]=3*2*1,base[3]=5*3*2*1 ..........
            base[0] = 1;
            for (int i = 1; i < primeNum.size(); i++) {
                base[i] = base[i - 1] * primeNum.get(i);
            }

            A = transTo10(Aarray, base);
            B = transTo10(Barray, base);
            int num = A + B;
            StringBuilder result = transTohuo(num, base);
            System.out.println(result);
        }
    }

    private static StringBuilder transTohuo(int num, int[] base) {
        StringBuilder result = new StringBuilder();
        if (num == 1) {
            result.append("1");
            return result;
        }

        int k = maxIndex(num, base);
        result.append(num / base[k]);
        result.append(',');
        num = num % base[k];
        k--;

        while (num != 0) {
            if (base[k] > num) {
                result.append(0);
                k--;
            } else {
                result.append(num / base[k]);
                num = num % base[k];
                k--;
            }
            if (k != -1) result.append(',');
        }
        while (k != -1) {
            result.append(num);//num=0
            if (k != 0) result.append(',');
            k--;
        }


        return result;
    }

    public static boolean isPrim(int num) {
        int i;
        for (i = 2; i < num; i++) {
            if (num % i == 0) break;
        }
        if (i == num) return true;
        else return false;
    }

    public static int transTo10(String[] arr, int[] base) {
        int num10 = 0;
        for (int i = 0; i < arr.length; i++) {
            int nowBase = base[i];
            int currentOrder = Integer.parseInt(arr[arr.length - i - 1]);//当前位数
            num10 = num10 + currentOrder * nowBase;
        }
        return num10;
    }

    public static int maxIndex(int num, int[] base) {
        int index = 0;//记录不大于num的最大值所在索引
        for (int i = 0; i < base.length; i++) {
            if (base[i] > num) {
                index = i - 1;
                break;
            }
        }
        return index;
    }
}


发表于 2021-02-04 11:51:55 回复(0)
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
//对于不确定的数一定要赋值
using namespace std;
int x[30],y[30];
int res[30];
int prime[25]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};

int main()
{
    string a;
    string b;
    while(cin>>a>>b&&a!="0"&&b!="0")
    {
        memset(x,0,sizeof(x));
        memset(y,0,sizeof(y));
        int numberA=0;
        int numberB=0;
        for(int i=0;i<a.size();i++)
        {
            if(a[i]==',')
            {
                continue;
            }
            else{

                int all=0;
                while(1)
                {
                    all=all*10+(a[i]-'0');
                    i++;
                    //cout<<all<<endl;
                    if(a[i]==','||i>=a.size())//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                    {
                        i--;
                        break;
                    }
                }
                x[numberA]=all;
                numberA++;
            }
        }
        for(int i=0;i<b.size();i++)
        {
            //cout<<"i:"<<i<<endl;
            if(b[i]==',')
            {
                continue;
            }
            else
            {
                int all=0;
                while(1)
                {
                    all=all*10+(b[i]-'0');
                    i++;
                    //cout<<all<<endl;
                    if(b[i]==','||i>=b.size())//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                    {
                        i--;
                        break;
                    }
                }
                y[numberB]=all;
                numberB++;

            }
        }
        for(int i=0;i<numberA/2;i++){
            int temp=x[i];
            x[i]=x[numberA-i-1];
            x[numberA-i-1]=temp;
        }


        for(int i=0;i<numberB/2;i++){

            int temp=y[i];
            y[i]=y[numberB-i-1];
            y[numberB-i-1]=temp;


        }
//        for(int i=0;i<numberA;i++){
//             cout<<"x["<<i<<"]:"<<x[i]<<endl;
//        }
//        cout<<endl;
//        for(int i=0;i<numberB;i++){
//             cout<<"y["<<i<<"]:"<<y[i]<<endl;
//        }
//        cout<<endl;

        int carry=0;
        int number=max(numberA,numberB)+1;
        for(int i=0;i<number;i++)
        {

            res[i]=x[i]+y[i]+carry;
            carry=res[i]/prime[i];
            //cout<<carry<<endl;
            res[i]=res[i]%prime[i];
        }



        int pos=30;
        while(res[pos]==0)
        {
            pos--;
        }
        for(int i=pos;i>=0;i--)
        {
            cout<<res[i];
            if(i!=0){
                cout<<",";
            }
        }
        cout<<endl;
    }
    return 0;
}


发表于 2020-09-27 20:08:20 回复(0)

问题信息

难度:
48条回答 7289浏览

热门推荐

通过挑战的用户

查看代码