0
点赞
收藏
分享

微信扫一扫

输出n位k进制数

吴陆奇 2022-07-27 阅读 40


题目描述:

给定n, k,按顺序输出所有的n位k进制数。

例如,n=3, k=2时

000, 001, 010, 011, 100, 101, 110, 111

看到这道题本来的思路是从10进制数0开始,每次加一,分别把它转换为k进制数,判断是否是n位的。

但是比如0转换为2进制为0,但是结果要的是n位,也就是说比如n=3,必须为000才可。

如果是整型数据,那么只需要在格式控制上处理一下即可,可是这里的问题是当k>9的时候就会出现A,B,C.....也就是必须用字符存储,那么格式前面的位数补齐就不太好处理了。

于是只好换了种思路。

既然已经给定了n和k,那么直接输出对应的数即可。


#include <iostream>
#include<stdio.h>
#define MAX_Num 100001
using namespace std;
char s[MAX_Num];
int n,k=0;
void printss()//输出满足要求的数
{
for(int i=0; i<n; ++i)
{
printf("%c",s[i]);
}
printf("\n");
}
void f(int d)//求所有n位k进制数
{
if(d==n)
{
printss();
return;
}
else
{
for(int i=0; i<k; ++i)
{
if(i<10)
s[d]=i+'0';
else
s[d]=i-10+'A';
f(d+1);
}
}
}
int main()
{
scanf("%d %d",&n,&k); //n位k进制数
f(0);
return 0;
}

输出n位k进制数_进制



输出n位k进制数_#include_02

关于第一种思路,还是有些不舍,于是在写博客时再次找了下格式控制符的用法,发现原来不只是整型数可以在前面补齐0,字符型也是可以的。

但是要将a输出4位,不够补0,printf("%04d",a);即可

若是要输出n位呢,printf("%0nd",a);这种写法显然是错误的.

正确的应为printf("%0*d",n,a);即不显示指明输出最小宽度,而是以星号代替,具体宽度在printf的输出参数列表中给出。


#include<stdio.h>
int main()
{
int a,b;
char S[10];
gets(S);
scanf("%d %d",&a,&b);
printf("%04d %4d\n",a,b);
int m=8;
printf("%0*s",m,S);
return 0;
}

输出n位k进制数_整型_03



那么,第一种方法就也同样可以轻松解决这个问题。

#include<stdio.h>
int count;
int n,k;
char str[35];
void change(int p,int n);
int main()
{
scanf("%d %d",&n,&k);
int q;
for(q=0;count<=n;q++)
{
change(q,k);
}
return 0;
}
void change(int p,int k)//把10进制数p装换为k进制数
{
char sm[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int i=0,j,g;
while(p)
{
g=p%k;
str[i++]=sm[g];
p=p/k;
}
count=i;
if(count<=n)
printf("%0*s ",n,str);
}


心得:有思路了真的不能随便放弃,仔细想想自己当前所遇到的问题是什么,这个问题真的不能解决嘛?该如何去解决这个问题。


举报

相关推荐

0 条评论