在k进制中,一个m位的自然数n,若满足:n的n次幂的后m位仍为n,则称n为k进制下的幂自守数。
输入:k和m,k和m,k>=2&&k<=16,m>=1&&m<=4,输出所有幂自守数。
以十进制4位数为例: 输入10 4
应该输出:1376、3376、5376、7376、9376、2976、4976、6976、8976
我的代码不能实现准确的功能,可能是算法设计的不好,忘高手指教。
#include "stdio.h"
#include "math.h"
char code[6]={'A','B','C','D','E','\n'};
double data(int k,int m );
int judge(int k,int m,double x );
void convert(double d,int k,int a[]);
void main()
{
int k,m;
int flag=0;
double x,i;
do
{
printf("请输入进制k(2~16)和位数m(1~4):\n");
scanf("%d %d",&k,&m);
if(k<2||k>16||m<1||m>4)
printf("输入参数有误!\n");
}while(k<2||k>16||m<1||m>4);
x=data(k,m);
for(i=pow(k,m-1);i<=x;i++)//这里i的初始值为了保证位的一致
{
flag=judge(k,m,i);
if(flag==1) printf("在%d进制%d位数中:%.0lf 是幂自守数!\n",k,m,i);
}
}
double data(int k,int m)//找出k进制m位数的最大值
{
double x=0.0;
int i;
for(i=0;i
x+=pow(k,i)*(k-1);
return x;
}
int judge(int k,int m,double da)
{
int j;
double s=1.0;
int pre[4]={0};
int after[4]={0};
convert(da,k,pre);
for(j=0;j<=da;j++)
{
if(int(s)==0)
{
s=s*pow(k,m+1);
break;
}
else if(s>pow(k,m+1))
s=(int)(s*da)%(int)pow(k,m+1);//保留后m位即可
else
s=s*da;
}
convert(s,k,after);
for(j=0;j
if(pre[j]!=after[j]) return 0;
return 1;
}
void convert(double d,int k,int a[])
{
int i=0;
int f;
f=(int)d;
do
{
a[i++]=f%k;
f=f/k;
}while(f!=0);
}
char定义的数组是在进制高于10的时候处理输出用的,该功能尚未完善,现在希望能准确的求出答案。望高手指教。