1295.负权数

这道题关键在于模拟连除倒取余数法,如何确定每一步“合适”的商和余数(因为余数不能为负),以保证商*除数+余数=被除数。此外要注意的一点是,正数%负数---余数是为正的(余数正负同被除数的正负)

 1 #include<iostream>
 2 #include<memory.h>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 int main()
 7 {
 8     int N;
 9     while(cin>>N)
10     {
11         int r;
12         cin>>r;
13         char display[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
14         int mod[16];
15         if(N==0)
16         {
17             cout<<0<<endl;
18         }
19         else
20         {
21             int i=0;
22             while(N!=0)    //解题关键的思路实现
23             {
24                 int x=N/r;  //这是初步得出的商 ,可能要改
25                 int y=N-(x*r);   //y是初步的余数,可能要改
26                 N=N/r;       
27                 if(y<0)  //由于余数不能用负数表示,故要想办法转化为正数。方法其实就是
28                 {
29                     y=y+abs(r);  //本位变为与进制的补植,同时向高位进一位
30                     N++;
31                 }
32                 mod[i]=y;
33                 i++;
34             }
35             for(int j=i-1;j>=0;j--)
36             {
37                 cout<<display[mod[j]];
38             }
39             cout<<endl;
40         }
41     }
42     //system("pause");
43     return 0;
44 }
posted @ 2012-09-19 09:00  晨风世界  阅读(219)  评论(0编辑  收藏  举报