今天尝试在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;
}