https://abc105.contest.atcoder.jp/tasks/abc105_c
题意:
给你一个n,让你转为【-2进制】。
输出S
POINT:
假设为k进制。
模拟正k进制转换可得以下操作。
找到最小的非负整数x使得当前数减x能被k整除,这个x将作为新的最高位写到结果中,然后当前数减去x再除以k。
负k进制也可以一样的操作。
#include <stdio.h>
int num[50];
int main()
{
int n;
scanf("%d",&n);
int cnt=0;
if(n==0){
printf("0\n");
return 0;
}
while(n){
if(n%2!=0){
num[++cnt]=1;
n=(n-1)/(-2);
}else{
num[++cnt]=0;
n=n/(-2);
}
}
for(int i=cnt;i>=1;i--)
printf("%d",num[i]);
}
推广到k进制。 -16<=k<=16。
#include <stdio.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
char S[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
int f(int n,int k)
{
int kk=abs(k);
return (n%k+kk)%kk;
}
int main()
{
int n,k;
string ans;
while(cin>>n>>k){
ans="";
if(n==0){
printf("0\n");
continue;
}
while(n){
int x=f(n,k);//n-x可以被k整除,且x最小
ans+=S[x];
n=(n-x)/k;
}
reverse(ans.begin(),ans.end());
cout<<ans<<endl;
}
}