0506年题目练手

今天尝试在3小时内完成两年的真题,前面还比较顺利,05年试题只花了1个小时左右,只出现了两个小BUG,查看题目条件很快发现了问题,总体上来说还算过得去,不到一个半小时解决了8道,比较棘手的就是火星A+B和简单计算器,最终搞定火星A+B花了1个小时

 

出现了几个问题,输入处理上出现了两次问题,第一次误以为每一个逗号之间都只有一位,其实两者之间是火星上的一位,可能是由好几位组成的,识别了这个问题修改了程序却又引入了一个心的问题,每一次取字符根据字符性质决定操作(不要用两层循环,不然很难处理,很容易出现边界问题),根据字符决定下一步跳转比较方便 掌握该框架,出现的疏忽是识别到非数字也非逗号时直接跳出输入,忘了写入目前操作数的最后一位,还好调试定位到问题(增强调试方面的能力,养成迭代开发的好习惯,程序复杂了编程过程中一步步检查);最后一个问题找了比较久,还是平时不太注意,在对操作数高地位调整的过程中直接使用了值传递,晕~~以后要养成好习惯,牵涉到值交换的一定要用引用

 

 

 

 

以下为AC的代码:

#include <iostream>
#include <cmath>
using namespace std;

int Prim[30];

int num1[30];
int num2[30];
int top1,top2;

void input()
{
 memset(num1,0,sizeof(num1));
 memset(num2,0,sizeof(num2));
 top1=top2=-1;
 char c;
 int value=0;
 while(c=getchar())
 {
  if(c>='0'&&c<='9')value=value*10+c-'0';
  else if(c==',')num1[++top1]=value,value=0;
  else
  {
   num1[++top1]=value,value=0;
   break;
  }
 }
 value=0;
 while(c=getchar())
 {
  if(c>='0'&&c<='9')value=value*10+c-'0';
  else if(c==',')num2[++top2]=value,value=0;
  else
  {
   num2[++top2]=value,value=0;
   break;
  }
 }
}
bool juge()
{
 int i;
 int tag=1;
 for(i=0;i<=top1;i++)
  if(num1[i]!=0){tag=0;break;}
 if(tag)return true;

 tag=1;
 for(i=0;i<=top2;i++)
  if(num2[i]!=0){tag=0;break;}
 if(tag)return true;

 else return false;
}

bool IsPrim(int n)
{
 for(int i=0;Prim[i]*Prim[i]<=n;i++)
  if(n%Prim[i]==0)return false;
 return true;
}

void Init()
{
 Prim[0]=2;
 Prim[1]=3;
 int top=1;
 for(int i=4;top<=30;i++)
  if(IsPrim(i))Prim[++top]=i;
}

inline void swap(int& x,int& y)
{
 int temp;
 temp=x;
 x=y;
 y=temp;
}
void convert()
{
 int i,j;
 for(i=0,j=top1;i<j;i++,j--)
  swap(num1[i],num1[j]);

 for(i=0,j=top2;i<j;i++,j--)
  swap(num2[i],num2[j]);
}

int add()
{
 int max=top1>top2?top1:top2;
 for(int i=0;i<=max;i++)
 {
  if(num1[i]+num2[i]>=Prim[i])num1[i]+=num2[i]-Prim[i],num1[i+1]++;
  else num1[i]+=num2[i];
 }
 if(num1[max+1])max++;
 return max;
}
void Print()
{
 int max=add();
 for(int i=max;i>0;i--)
  cout<<num1[i]<<",";
 cout<<num1[0]<<endl;
}
int main()
{
 Init();
 while(1)
 {
  input();
  if(juge())break;
  convert();
  Print();  
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值