1 题目描述
负进制数
成绩 | 10 | 开启时间 | 2021年09月17日 星期五 18:00 |
折扣 | 0.8 | 折扣时间 | 2021年11月6日 星期六 00:00 |
允许迟交 | 否 | 关闭时间 | 2021年11月21日 星期日 00:00 |
我们已经接触过了二进制数,八进制数,十进制数,十六进制数,学会了它们之间的转换,甚至还会其他正进制数的转换,那你听说过负进制数吗?
一般来说,任何一个非0整数N(也可以排除1,-1)都有一个对应的N进制数集,每个N进制数都对应一个十进制数,比如-15(十进制)对应110001 (−2进制):
110001=1×(−2) ^5 +1×(−2) ^4 +0×(−2) ^3 +0×(−2) ^2 +0×(−2) ^1 +1×(−2) ^0请设计一个程序,输入一个十进制数和一个负进制数的基数, 并将此十进制数转换为此负进制下的数。
输入描述
输入的每行有两个输入数据。
第一个是十进制数 n。 第二个是负进制数的基数 R。-2≥R≥-10,0<|n| ≤10^9
输出描述
输出此负进制数及其基数,不考虑基数超过10的情况。
2 代码
//注意被除数为负数的时候,余数必须求出来是正数才可以倒序输出得到相应进制数
#include<stdio.h>
#include<stdlib.h>
int conversion(long long n,int r){
int i;
long long handle;
int out[1000];
handle = n;
for(i=0;handle!=0;i++){
if(handle<0&&handle%r!=0){
out[i]=handle%r-r;
handle=(handle-out[i])/r;
}
else{
out[i]=handle%r;
handle/=r;
}
}
printf("%lld=",n);
for(i=i-1;i>=0;i--){
printf("%d",out[i]);
}
printf("(base %d)\n",r);
return 0;
}
int main(int argc, char *argv[]){
int r;
long long n;
//freopen("file.txt","r",stdin);
scanf("%lld %d",&n,&r);
conversion(n,r);
return 0;
}