首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

OJ里头的题目,火星A+B,求大牛帮助

2012-08-02 
OJ里面的题目,火星A+B,求大牛帮助案例都通过了,代码有点乱,实在想不出什么特殊情况了,请大神看看我的代码

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不了啊,样例都通过了

C/C++ code
#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;}


[解决办法]
结果对不对?
思想说白了就是从低位加,对应位相加后再加上进位,然后与su[i]比较看是否需要进位
刚开始时候没必要花费那么多时间计算su数组,直接赋值:
int su[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,101,103,107,109,113};
[解决办法]
http://topic.csdn.net/u/20090309/17/64e92b5c-2bde-4f0a-97a0-f593d758f581.html

可以看看以前的帖子
[解决办法]
用面向对象方法写了一个,因为实在不清楚题目对输入是如何规定的,所以就没有按题意处理
PS:没有检查各位数的合法性
C/C++ code
#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;} 


[解决办法]
浙大往年的真题,今年恰好我浙大复试完,亦做过该题,代码如下:

C/C++ code
#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人品爆发了

热点排行