OJ里面的题目,火星A+B,求大牛帮助
案例都通过了,代码有点乱,实在想不出什么特殊情况了,请大神看看我的代码啊,求指教什么地方漏了!
读入两个不超过25位的火星正整数A和B,计算A+B。需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数。例如:地球上的10进制数2,在火星上记为“1,0”,因为火星个位数是2进制的;地球上的10进制数38,在火星上记为“1,1,1,0”,因为火星个位数是2进制的,十位数是3进制的,百位数是5进制的,千位数是7进制的……
以上是原题.
样例输入:
1,0 2,1
4,2,0 1,2,0
1 10,6,4,2,1
0 0
样例输出:
1,0,1
1,1,1,0
1,0,0,0,0,0
我的代码,有点乱,基本思想就是把输入字符转换成数组然后从尾到头一位一位相加然后有进位就进位.就是AC不了啊,样例都通过了
#include <iostream>#include <cmath>#include <cstring>using namespace std;int isu(int a){ int j=sqrt((double)a); for(int i=2;i<=j;++i) if(a%i==0) return 0; return 1;}int main(){ int su[30]; su[0]=2; for(int i=1;i!=30;++i) { su[i]=su[i-1]+1; while(!isu(su[i])) ++su[i]; } /* for(int i=0;i!=27;++i) cout<<su[i]<<' '; cout<<endl;*/ char a[100]; char b[100]; int c[60]; int a2[60]; int b2[60]; int tmp=0; while(cin>>a>>b) { int n=strlen(a); int m=strlen(b); if(n==1&&m==1&&a[0]=='0'&&b[0]=='0') break; int sa=0; int fa=0; int sb=0; int fb=0; for(int i=0;i!=n;++i) { if(a[i]==',') { a2[fa++]=sa; sa=0; continue; } sa=sa*10+(a[i]-'0'); } a2[fa++]=sa; for(int i=0;i!=m;++i) { if(b[i]==',') { b2[fb++]=sb; sb=0; continue; } sb=sb*10+(b[i]-'0'); } b2[fb++]=sb; int k=0; //su下标 tmp=0; //进位 int i,j; for(i=fa-1,j=fb-1;i>=0&&j>=0;--i,--j) { int a1=a2[i]; int b1=b2[j]; //cout<<a1<<' '<<b1<<endl; int c1=(a1+b1+tmp)%su[k]; //cout<<c1<<endl; tmp=(a1+b1+tmp)/su[k]; c[k++]=c1; } while(i>=0) { int c1=(a2[i]+tmp)%su[k]; tmp=(a2[i]+tmp)/su[k]; c[k++]=c1; --i; } while(j>=0) { int c1=(b2[j]+tmp)%su[k]; tmp=(b2[j]+tmp)/su[k]; c[k++]=c1; --j; } if(tmp!=0) { c[k++]=tmp; } for(int i=k-1;i>=0;--i) { if(i==0) cout<<c[i]<<endl; else cout<<c[i]<<','; } } return 0;}
#include <iostream>#include <cstring>using namespace std;class MarsNum{protected: int bits[25]; int bitnum;public: static int rights[25]; MarsNum(char *b = NULL); MarsNum(int i); ~MarsNum() { } static MarsNum EarthToMars(int a); int MarsToEarth() const; MarsNum operator+(const MarsNum &n); friend ostream &operator<<(ostream &out, const MarsNum &n);};int MarsNum::rights[25] = { 1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89 };MarsNum::MarsNum(char *b){ int i, n; for (i = 0; i < 25; ++i) bits[i] = 0; bitnum = 0; if (b != NULL) { for (n = 0; *b != '\0'; ++b) { if (*b != ',') { n *= 10; n += *b - '0'; } else { bits[bitnum++] = n; n = 0; } } bits[bitnum++] = n; }}MarsNum::MarsNum(int i){ *this = EarthToMars(i);}MarsNum MarsNum::EarthToMars(int a){ MarsNum ret; int i = 24, n; bool flag = false; while (i >= 0) { n = a % rights[i]; if (n != a || flag) { flag = true; ret.bits[ret.bitnum++] = a / rights[i]; a %= rights[i]; } --i; } return ret;}int MarsNum::MarsToEarth() const{ int a = 0, i = 0, s = this->bitnum; while (i < this->bitnum) a += this->bits[i++] * rights[--s]; return a;}MarsNum MarsNum::operator+(const MarsNum &n){ return EarthToMars(n.MarsToEarth() + this->MarsToEarth());}ostream &operator<<(ostream &output, const MarsNum &n){ int i; for (i = 0; i < n.bitnum - 1; ++i) output << n.bits[i] << ','; output << n.bits[i]; return output;}int main(){ MarsNum a("4,3,1,0"), b(125); MarsNum c = a + b; cout << a << endl; cout << a.MarsToEarth() << endl; cout << b << endl; cout << b.MarsToEarth() << endl; cout << c << endl; cout << c.MarsToEarth() << endl; return 0;}
[解决办法]
浙大往年的真题,今年恰好我浙大复试完,亦做过该题,代码如下:
#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#include<ctype.h>#include<iostream>#include<string>#include<vector>#include<list>#include<stack>#include<queue>#include<set>#include<map>#include<bitset>#include<algorithm>using namespace std;int d[26];bool isprime(int n) //判断是否为质数{ if(n<=1) return false; if(n==2) return true; if(n%2==0) return false; int i,m=sqrt(double(n)); for(i=3;i<=m;i+=2) if(n%i==0) return false; return true;}void getnum(vector<int> &v,char s[]) //将字符串转为火星数{ int i; int num=0; for(i=0;s[i];++i) if(s[i]!=',') //不是逗号则说明是数,就转为10进制 num=num*10+s[i]-'0'; else //是逗号,则将num放入相应的数位 { v.push_back(num); num=0; } v.push_back(num);}void add(vector<int> &v1,vector<int> &v2,vector<int> &v) //两火星数相加{ reverse(v1.begin(),v1.end()); reverse(v2.begin(),v2.end()); int i,carry=0; for(i=0;i<v1.size()&&i<v2.size();++i) { int sum=v1[i]+v2[i]+carry; v.push_back(sum%d[i]); carry=sum/d[i]; } if(i<v1.size()) { while(i<v1.size()) { int sum=v1[i]+carry; v.push_back(sum%d[i]); carry=sum/d[i]; ++i; } } else { while(i<v2.size()) { int sum=v2[i]+carry; v.push_back(sum%d[i]); carry=sum/d[i]; ++i; } } if(carry) v.push_back(carry); reverse(v.begin(),v.end());}int main(){ int len=0; int i; for(i=2;len<26;++i) //获取质数 if(isprime(i)) d[len++]=i; char s1[100],s2[100]; while(scanf("%s%s",s1,s2),strcmp(s1,"0")!=0||strcmp(s2,"0")) { vector<int> v1,v2,v; getnum(v1,s1); getnum(v2,s2); add(v1,v2,v); printf("%d",v[0]); for(i=1;i<v.size();++i) printf(",%d",v[i]); puts(""); } return 0;}
[解决办法]
楼主,刚试了一下,把数组60开到100就AC了,你试试。
[解决办法]
坑爹啊坑爹,这是A题是需要人品滴,LZ人品爆发了