文章目录:
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);
}
int after[4]={0}; convert(da,k,pre); for(j=0;jda;j++) /*这里da的下界要注意,是da次,你写成da+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);}