c语言十进制数m转k进制,C语言 k进制m位幂自守数问题

在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的时候处理输出用的,该功能尚未完善,现在希望能准确的求出答案。望高手指教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值