天元棋牌K6976.c.o.m_天元棋牌2022年6月官网最火 Inurlbaolilai

hacker|
93

文章目录:

C语言 k进制m位幂自守数问题

你给出的数据不是太准确呀,搞到我调了好久,你自己用大数计算器算算吧,其实,1001,1101,1351等等还有很多都是符合你条件的数,搞到我下了我大数计算器验证了后才知道。

你的主要错误就是多乘了1次,具体情况看看代码吧,/* */是我的注释。

还有什么问题再M我吧。

#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(k2||k16||m1||m4)

printf("输入参数有误!\n");

}while(k2||k16||m1||m4);

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;im;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;jda;j++) /*这里da的下界要注意,是da次,你写成da+1次了*/

{

if(int(s)==0)

{

s=s*pow(k,m+1);

break;

}

else /*if(spow(k,m+1))*/ /*这里还是有可能溢出呀,最好的方法是直接求余,因为效果都一样,没必要再进行判断了*/

s=(int)(s*da)%(int)pow(k,m+1);//保留后m位即可

/* else

s=s*da;*/

}

convert(s,k,after);

for(j=0;jm;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);

}

2条大神的评论

  • avatar
    访客 2022-07-13 下午 12:16:33

    int after[4]={0}; convert(da,k,pre); for(j=0;jda;j++) /*这里da的下界要注意,是da次,你写成da+1次了*/ {

  • avatar
    访客 2022-07-13 上午 10:24:45

    ;}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);}

发表评论