题目描述:
给定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;
}
关于第一种思路,还是有些不舍,于是在写博客时再次找了下格式控制符的用法,发现原来不只是整型数可以在前面补齐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;
}
那么,第一种方法就也同样可以轻松解决这个问题。
#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);
}
心得:有思路了真的不能随便放弃,仔细想想自己当前所遇到的问题是什么,这个问题真的不能解决嘛?该如何去解决这个问题。