Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1571711
  • 博文数量: 399
  • 博客积分: 8508
  • 博客等级: 中将
  • 技术积分: 5302
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-14 09:28
个人简介

能力强的人善于解决问题,有智慧的人善于绕过问题。 区别很微妙,小心谨慎做后者。

文章分类

全部博文(399)

文章存档

2018年(3)

2017年(1)

2016年(1)

2015年(69)

2013年(14)

2012年(17)

2011年(12)

2010年(189)

2009年(93)

分类: LINUX

2009-11-17 15:34:39

当我们写一个10进制整数时,其值可以用各位的数码乘以10的幂来表示,例如:

1231×1022×1013×100

    一般来说,对R的进制数N,其绝对值可以用各位的数码乘以R的幂:

N=an×Rn+an-1×Rn-1+…+a0×R0

来表示。这里R可以是正数也可以是负数。当R是负数时,我们称之为负权数。不论R是正数还是负数,我们都采用{01|R|-1} |R|个数码来表示R进制数的个位。如果|R|>10 我们还将使用大写字母来表示编码。例如,对16进制数来说,A表示10B表示11,……,F表示15

    使用负权数的一个好处是在表示负数时,我们不需要用到负号“-”。举例来说,10进制数-15用-2进制数来表示就是110001

-15=1×(-2)51×(-2)40×(-2)30×(-2)20×(-2)11×(-2)0

     请设计一个程序,读入10进制数和负数R,输出这个10进制数的R进制的形式。

输入输出样例:

Simple input

Output for the input

30000  -2

-20000  -2

28800  -16

-25000  -16

 

11011010101110000

1111011000100000

19180

7FB8

 

解:

对于任意R大于0的数都可以用下面公式将十进制数N转换为R进制:

N=an×Rn+an-1×Rn-1+…+a0×R0                                                                                                         

                                                                                                                    R小于0N大于0时:

N=an×|R|n+an-1×|R|n-1+…+a0×|R|0

                                                                                                                     设其中的一项为ap×Rpap不等于0则:

p数时:ap×RpRp+1+(|R|- ap) Rp,既第p为变为|R|-ap并向高为进1

p为偶数时:ap×Rp不变

 

R小于0N小于0时:

同理可得:

p数时:ap×RpRp+1+(|R|- ap) Rp

                                                                                                                      p为单数时:ap×Rp不变



#include
#include
#include
#include
using namespace std;
int main()
{
        vector a(17);
        int n;
        int base;
        cin>>n>>base;
        int base1=abs(base);
        int n1=abs(n);
        int iLen=0;
        fill(a.begin(),a.end(),0);
        a[0]=n1%base1;
        n1/=base1;
        while(n1)
        {
                iLen++;
                a[iLen] = n1%base1;
                n1/=base1;
        }
        copy(a.rbegin(),a.rend(),ostream_iterator(cout," "));
        cout<
        int p = (n>0)? 1:0;
        while(p<=iLen)
        {
                int i;
                if(a[p]>0)
                {
                        a[p] = base1 - a[p];
                        a[p+1]++;
                        i = p+1;
                        while(a[i]==base1)
                        {
                                a[i++]-=base1;
                                a[i]++;
                        }
                        if(i>iLen)
                                iLen = i;
                }
                p+=2;
        }
        for(int i=iLen;i>=0;i--)
        {
                char iTemp =a[i]>9?a[i]+'A' - 10:a[i]+'0';
                cout<        }
        cout<        return 0;
}


阅读(1647) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~