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
    评论
这里提供一种通用的算法,可以将任意进制换为另一种任意进制。 1. 将原始换为十进制。 对于一个n进制,每一位上的字乘以n的次方,然后将所有结果相加,即可得到该十进制表示。 例如,将二进制1011换为十进制: 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0 = 11 2. 将十进制换为目标进制。 将十进制除以目标进制,得到商和余。将余作为目标进制的一个字,将商作为新的十进制,重复以上步骤,直到商为0为止。最后将所有余按照从低位到高位的顺序排列,就得到了目标进制表示的。 例如,将十进制11换为八进制: 11 ÷ 8 = 1 ... 3 1 ÷ 8 = 0 ... 1 所以,11的八进制表示为13。 完整的代码实现如下: ```c #include <stdio.h> char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; void reverse(char *str) { int length = 0; while (str[length] != '\0') { length++; } for (int i = 0; i < length / 2; i++) { char temp = str[i]; str[i] = str[length - i - 1]; str[length - i - 1] = temp; } } void convert(char *input, int sourceRadix, int targetRadix, char *output) { int value = 0; for (int i = 0; input[i] != '\0'; i++) { int digit = 0; if (input[i] >= '0' && input[i] <= '9') { digit = input[i] - '0'; } else if (input[i] >= 'A' && input[i] <= 'Z') { digit = input[i] - 'A' + 10; } else if (input[i] >= 'a' && input[i] <= 'z') { digit = input[i] - 'a' + 10; } value = value * sourceRadix + digit; } int index = 0; while (value > 0) { int remainder = value % targetRadix; output[index++] = digits[remainder]; value /= targetRadix; } if (index == 0) { output[index++] = '0'; } output[index] = '\0'; reverse(output); } int main() { char input[100]; printf("Enter the number to convert: "); scanf("%s", input); int sourceRadix, targetRadix; printf("Enter the source radix: "); scanf("%d", &sourceRadix); printf("Enter the target radix: "); scanf("%d", &targetRadix); char output[100]; convert(input, sourceRadix, targetRadix, output); printf("%s (%d) = %s (%d)\n", input, sourceRadix, output, targetRadix); return 0; } ``` 这个程序可以将任意进制换为任意进制,使用方法如下: 1. 运行程序。 2. 输入要换的字。 3. 输入原始进制。 4. 输入目标进制。 5. 程序会输出换后的字。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值