HDOJ 1230(火星A+B)

简介: 火星A+B Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7833    Accepted Submission(s): 2539 Problem Description 读入两个不超过25位的火星正整数A和B,计算A+B。

火星A+B

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7833    Accepted Submission(s): 2539


Problem Description
读入两个不超过25位的火星正整数A和B,计算A+B。需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数。例如:地球上的10进制数2,在火星上记为“1,0”,因为火星个位数是2进制的;地球上的10进制数38,在火星上记为“1,1,1,0”,因为火星个位数是2进制的,十位数是3进制的,百位数是5进制的,千位数是7进制的……
 

 

Input
测试输入包含若干测试用例,每个测试用例占一行,包含两个火星正整数A和B,火星整数的相邻两位数用逗号分隔,A和B之间有一个空格间隔。当A或B为0时输入结束,相应的结果不要输出。
 

 

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

 

Sample Input
1,0 2,1 4,2,0 1,2,0 1 10,6,4,2,1 0 0
 

 

Sample Output
1,0,1 1,1,1,0 1,0,0,0,0,0
/*
  Name: 火星A+B 
  Copyright: 
  Author: 火星十一郎 
  Date: 25-07-25 08:14
  Description: 
*/
/*long long的十进制为20位*/
#include<stdio.h>
#include<string.h> 
#include<math.h>
/*
不必用素数定理也可估算出1到n的素数个数小于n/2
因为至少去掉所有 偶数,或者开平方 找到可能的最大素数 
*/
#define N 10000
int vis[N],prim[26],ans[30];//全局数组自动赋值为0 
int k1,k2;
void is_prim()//不能与数组名同名 
{
	int m=(int)sqrt(N+0.5);
	int c=0,i,j;
	memset(vis,0,sizeof(vis));
	for(i=2;i<=m;i++)
	if(!vis[i])
	{
		prim[c++]=i;
		//printf("%d\n",prim[0]); 
		for(j=i*i;j<=N;j+=i)
			vis[j]=1;
	}
}
void add_output(int *temp1,int *temp2)
{
	int i,j;
	int len=k1>k2?k1:k2;
	memset(ans,0,sizeof(ans));
	//printf("%d\n",len);
	for(i=0,j=0;i<len;i++)
	{
		ans[i]+=temp1[i]+temp2[i];
		if(ans[j]>=prim[i]) 
		{
			ans[i+1]+= ans[i]/prim[i];
			ans[i]%=prim[i];
			//printf("%d\n",prim[i]);
			j++;
		}
		else
			j++;
	/*
	刚开始没加else 
	代码不对,因为若执行了if里的j++;则有继续执行了for循环体里的j++ 
	*/
	}
	if(ans[len]!=0)
		len++;
	for(i=len-1;i>=1;i--)
		printf("%d,",ans[i]);
	printf("%d\n",ans[0]);
}	
int main()
{
    char str1[100],str2[100];
	int temp1[100]={0},temp2[100]={0};
    int i,j; int temp,len1,len2;
    is_prim();
    prim[0]=2;
    /*
    for(i=0;i<26;i++)
    	printf("%d ",prim[i]);
    printf("\n");
    /*测试后发现,N值太小(125) 
    改过后 prim[0]=1;
	所以必须加上prim[0]=2; 
	*/
    while(1)
    {
		memset(str1,0,sizeof(str1));
		memset(str2,0,sizeof(str2)); 
		memset(temp1,0,sizeof(temp1)); 
		memset(temp2,0,sizeof(temp2)); 
        scanf("%s %s",str1,str2);
        k1=k2=0;
        if(str1[0]=='0'&&str2[0]=='0')
            break;
        len1=strlen(str1);
        len2=strlen(str2);
        //为防止最后一个字符未被转化为整形 
        str1[len1]=',';
		str2[len2]=',';  
		len1++;
		len2++; 
		 //转化为整形 
        for(i=0,temp=0,k1=0;i<=len1;i++)
        {
			if(str1[i]==',')
			{
				temp1[k1++]=temp;
				temp=0;
				continue;
			}
			temp=temp*10+str1[i]-'0';
		}
		for(i=0,temp=0,k2=0;i<=len2;i++)
        {
			if(str2[i]==',')
			{
				temp2[k2++]=temp;
				temp=0;
				continue;
			}
			temp=temp*10+str2[i]-'0';
		}	
        //for(i=0;str1[i]!='\0';i++)
        //逆置 ,j<len1-1不能加等号,因为最后人为加了逗号 
        for(i=0,j=k1-1;j>=i;i++,j--)
        {   
      		temp=temp1[j];//temp需要时char 
            temp1[j]=temp1[i];
            temp1[i]=temp;
        }
      	for(i=0,j=k2-1;j>=i;i++,j--)//逆置 
        {   
      		temp=temp2[j];
            temp2[j]=temp2[i];
            temp2[i]=temp;
        }
		add_output(temp1,temp2);
	}
	return 0;
}
		
做这道题时,原来两个temp没清零,结果同一组数据,每次结果不一样
看来,变量一定要赋初值,数组一定清空		
		
			

        
         
            
            
            
        

 

目录
相关文章
hdoj 1166 敌兵布阵
暴力超时,这道题可以用线段树做,因为更新的是单个节点,我们也可以用数组数组来做,我将两种方法的代码都给出 数组数组最适宜的用途就是区间求和和点的更新,但树状数组并不适用于区间的更新问题,也不是做不到,比较麻烦且难理解,有兴趣的可以看看这个
32 0
hdoj 1230 火星A+B
if(i == 1 && j == 1 && !a[0] && !b[0])
39 0
HDOJ 2044 一只小蜜蜂...
HDOJ 2044 一只小蜜蜂...
141 0
HDOJ 2044 一只小蜜蜂...
HDOJ 1215 七夕节
HDOJ 1215 七夕节
118 0
HDOJ 1215 七夕节
HDOJ 2036 改革春风吹满地
HDOJ 2036 改革春风吹满地
114 0
HDOJ 2036 改革春风吹满地
|
Java
HDU - 2018杭电ACM集训队单人排位赛 - 1 - Problem C. 狙击敌人
HDU - 2018杭电ACM集训队单人排位赛 - 1 - Problem C. 狙击敌人
134 0
|
测试技术
HDOJ(HDU) 2186 悼念512汶川大地震遇难同胞——一定要记住我爱你
HDOJ(HDU) 2186 悼念512汶川大地震遇难同胞——一定要记住我爱你
123 0
HDOJ 2094 产生冠军
HDOJ 2094 产生冠军
107 0
HDOJ 2048 神、上帝以及老天爷
HDOJ 2048 神、上帝以及老天爷
123 0
HDOJ(HDU) 1408 盐水的故事
HDOJ(HDU) 1408 盐水的故事
196 0