反转的数字相加

  数字的反转数:一个数,将其首尾倒置。例如4321的反转数便是1234。

  编写一个程序,接受两个数字,并输出他们的反转数的和的反转数。例如,24和1。那么结果就是42+1->43->34

  注意,数字反转以后,数字的最前面和最后面不可能出现0!那么在先处理两个数相加的结果时,应该将最后方的0删除掉!

  如何避免多次的数字反转操作呢?可以参考自定义大数相加的算法!将数字按位相加,进行进位操作等!

  但是这里应该把两个数高位对齐再相加,相加时,从最高位加到最低位,并向低位进位,因为最后要反转过来!例如:1234与891的反转和,4321+198->4519->9154。表示为1234+8910->1+8, 2+9, 3+1+1, 4+0->9154。只需要一次的反转操作!

  注意,这里,接受两个数字的时候,按照字符串接收!

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main()
{
    string sa,sb,st;
    vector<int> v;
    vector<int>::iterator it;
    int i,j,a,b;
    int sum=0;
    int p=0;    // 进位标志
    int u=0;    // 输出标志

    cin>>sa>>sb;
    // 保证sa长度大于sb
    if(sa.size()<sb .size())
    {
        st=sa;
        sa=sb;
        sb=st;
    }
    for(i=0;i<sa.size();i++)
    {
        a = (sa[i]-'0') + 0;

        if(i >= sb.size())
            b = 0;
        else
            b = (sb[i]-'0') + 0;

        sum = a+b+p;
        p = sum / 10;
        v.push_back(sum%10);
    }

    // 最后一次进位
    if(p==1)
        v.push_back(1);

    // 删除后面的所有0
    while(1)
    {
        // 向量的最后一个元素的it位置为end()-1
        it = v.end()-1;
        if(*it==0)
            v.erase(it);
        else
            break;
    }

    // 实现从左边第一个非零开始输出
    for(j=0;j<v.size();j++)
    {
        if(u==0 && v[j]!=0)
            u=1;
        if(u==1)
            cout<<v[j];
    }
    cout<<endl;

    return 0;
}



Related posts

此条目发表在 C/C++ 分类目录,贴了 , , 标签。将固定链接加入收藏夹。

反转的数字相加》有 44 条评论

  1. 宁波SEO 说:

    专业的东西,学习了。

  2. 海龟来了 说:

    好专业、不错的说!

  3. vv 说:

    元宵节了,来问候一下,元宵节快乐哈

  4. bobsheep 说:

    有点晕…好久没看这个了

  5. 星网 说:

    这个是编程吗?我也想学编程。。。不知道要什么样的学位呀!

  6. 漠岚 说:

    这个东西要是写出来 会用到哪里?

  7. popo 说:

    看到数字,我就头晕!!!!

  8. 超人 说:

    代码盲 来 了。

  9. 大顾 说:

    看到了一个技术博客,过来瞅瞅,哈~

发表评论

电子邮件地址不会被公开。 必填项已被标记为 *

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>