C语言进制各位数的和

#include
int fun(int x,int r)
{int a=0;
while(x)
 {a+=x%r;
  x=x/r;
 }
 return a;
}
int main()
{int S1,S2,S3,i=0;
S1=S2=S3=0;
for(i=2992;i<=9999;i++)
{S1=fun(i,10);
 S2=fun(i,12);
 S3=fun(i,16);
 if(S1==S2&&S2==S3)
 printf("%d\n",i);}
return 0;
}

要求把输出2991到9999内十进制,十二进制和十六进制各个数的和相等的数,但我这个是输出结果是这样的

img

你可以对比一下我的代码:

#include <stdio.h>

int sum_of_digits(int n, int base) {
    int sum = 0;
    while (n > 0) {
        sum += n % base;
        n /= base;
    }
    return sum;
}

int main() {
    int i;
    for (i = 2991; i <= 9999; i++) {
        int sum10 = sum_of_digits(i, 10);
        int sum12 = sum_of_digits(i, 12);
        int sum16 = sum_of_digits(i, 16);
        if (sum10 == sum12 && sum12 == sum16) {
            printf("%d\n", i);
        }
    }
    return 0;
}


输出结果为:
2992
2993
2994
2995
2996
2997
2998
2999
3555
3661
3772
3883
3994
4888
4999
5561
5572
5583
5594
5662
5673
5684
5695
5885
5896
5999

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7596878
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:用C语言和数据结构解决十进制转换为二进制的问题
  • 你还可以看下c语言参考手册中的 c语言-调用、逗号、三元
  • 除此之外, 这篇博客: C基础(六)结构体中的 十三、案例-使用结构体动态接收控制台输入参数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 例如结构体用来保存学生的姓名和年龄, 通过控制台来录入,在不知道具体会录入多少学生的情况下就需要动态来申请堆内存了,这里会用到realloc来申请。效果图如下所示:
    在这里插入图片描述
    代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct student
    {
        char *name;
        int age;
    };
    
    int main()
    {
        struct student *p = NULL;
        int i = 1;
        while (1) // 死循环
        {
            char tmp[1024] = {0};
            printf("please input your name\n");
            scanf("%s", tmp);
    
            if (strcmp("exit", tmp) == 0)
                break; // 输入exit退出
    
            // 动态申请结构体的内存大小,第一次p=NULL,相当于malloc, 之后每次增加一个结构体的大小
            p = realloc(p, sizeof(struct student) * i);
    
            // 给name指针成员分配内存
            int len = strlen(tmp);
            // 因为申请的结构体内存是连续的,所以可以通过操作数组的方式来操作
            p[i - 1].name = malloc(len + 1);
            // 赋值name
            strcpy(p[i - 1].name, tmp);
    
            // 赋值age
            printf("please input your age\n");
            scanf("%d", &p[i - 1].age);
    
            i++;
        }
    
        // 输出
        int a;
        for (a = 0; a < i - 1; a++)
        {
            printf("name=%s,age=%d\n", p[a].name, p[a].age);
            free(p[a].name); // 释放name指针的内存
        }
        free(p); // 释放结构体的内存
    
        return 0;
    }
    
    
  • 您还可以看一下 吴永茂老师的C语言经典算法100道实战题课程中的 第008讲 三个数字从小到大输出小节, 巩固相关知识点