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