三位数黑洞数

该程序使用C语言编写,通过一个自定义函数获取数字的个位,然后使用插入排序对数字的各位进行重排。程序在不断重排和计算最大值与最小值之差的过程中,直到结果为495为止。主要涉及数字处理、循环和简单的排序算法。
摘要由CSDN通过智能技术生成
#include<stdio.h>

int get_digit(int *instead);
int main(void)
{
    int n;
    int max,min,result;
    int h,i, j,time;//控制循环次数
    int save,cont,instead;//保存后续还要用的数
    int count;//控制循环次数
    int array_size = 3;//方便理解
    int digits[3];
    int sortead_digits[3];

    max = min = result = 0;
    scanf("%d", &n);
    instead = n;
 do
 {
    for (i = 0; i < (sizeof(sortead_digits) / sizeof(sortead_digits[0]));i++)//数组初始化
    {
        sortead_digits[i] = 0;
    }
    count = 0;
    for (i = 0; instead != 0; i++) // 将n的各个位上的数拆分保存
        {
            digits[i] = get_digit(&instead);
            count++;
    }
    sortead_digits[count - 1] = digits[0];
    for (i = 1; i < count;i++)//插入排序算法,将n的各位置上的数重排
    {
        for (j = count - 1,time = 0; j >= (array_size - count) && time == 0;j--)
        {
            if (digits[i] > sortead_digits[j])//a数组与b数组中的数一一比较
            {
                save = sortead_digits[j];//保存好将要替换的b数组的数
                sortead_digits[j] = digits[i];//将大于该b数组的单位替换
                for (h = j - 1; h >= 0;h--)//将此b数组单位以前的单位往后移动一位
                {
                    cont = sortead_digits[h];
                    sortead_digits[h] = save;
                    save = cont;
                }
                time = 1;
            }
        }
    }
    max = sortead_digits[array_size - 1] * 100 + sortead_digits[array_size - 2] * 10 + sortead_digits[array_size - 3];
    min = sortead_digits[array_size - 3] * 100 + sortead_digits[array_size - 2] * 10 + sortead_digits[array_size - 1];
    result = max - min;//求差
    printf("%d - %d = %d\n", max, min, result);
    instead = result;//不满足则进行下一轮重排求差
 } while (result != 495);

}
int get_digit(int *instead)
{
    int result;
    result = *instead % 10;
    *instead /= 10;
    return result;
}

总结:

这个程序用到了前面的水仙花数中用于将n的各个位置上的数拆分保存的函数,所以建议大家在写程序的时候,重复用到的功能可以自定义一个函数去做,以后要用就可以直接复制粘贴,然后中间重排部分写了一个低级的插入排序的算法,程序的缺点是,有很多嵌套式的循环,对于理解很麻烦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无极帝国C++工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值