吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4399|回复: 6
收起左侧

[其他转载] 菜鸟的卡布列克运算 源代码

[复制链接]
Thorny_Devil 发表于 2015-4-17 23:10
本帖最后由 Thorny_Devil 于 2015-4-17 23:14 编辑

高手请直接忽略,勿喷,

哪里写的不好大可指出,,毕竟我是菜鸟。

问题描述:
  卡布列克运算是指对任意一个四位数,只要他们各个位上的数字不完全相同,
  就有这样的规律:
   1:把组成这个四位数的四个数字重新生成最大的四位数;如(3910重组后为9310)
   2:把组成这个四位数的四个数字重新生成最小的四位数;如(7600重组后为67)
   3:求出以上两数之差,得到一个新的四位数。
   重复以上过程,总能得到最后结果6174.
   编写卡布列克运算的验证程序。
示例:
  输入:1008
  输出:步骤1:1008重组最大数为8100,最小数为18, 生成数为:8100-18=8082
        步骤2:8082重组最大数为8820,最小数为288,生成数为:8820-288=8532
        步骤3:8532重组最大数为8532,最小数为288,生成数为:8532-2358=6174
        结束。

[C++] 纯文本查看 复制代码
#include<iostream>
using namespace std;

int a[4] = {0};//存放分解后的数字 
int num_max = 0;//重组生成的最大数 
int num_min = 0;//重组生成最小的数 
int num_new = 0;//生成数 

/*** 输入一个四位数 ***/
int get_num(){
        int num;
        cout << "请输入一个4位数:" ;
        cin >> num;
        while(num < 1000 || num > 9999){
                 cout << "输入有误,请重新输入一个四位数:";
                 cin >> num;
                cout << endl;
        }
        return num;
}

/*** 分解输入的四位数 ***/
void resolve(int num){
        a[0] = int (num / 1000);
        a[1] = int ((num - a[0] * 1000) / 100);
        a[2] = int ((num - a[0] * 1000 - a[1] * 100) / 10);
        a[3] = num % 10;
}

/*** 对分解的四位数进行排序及重组 ***/
void sort_recombine(int num){
        int i,j,min;
        for (i = 0;i < 4 - 1;i++){        //做第 i + 1 次排序 
                min = i;                                //在当前没有排序的数字中选出最小值,并记录a[min] 
                for (j = i + 1;j < 4;j++){ 
                        if (a[j] < a[i]){
                                min = j;                //记录下目前找到的最小数值所在位置 
                                 a[i] = a[i] ^ a[min];
                                 a[min] = a[min] ^ a[i];
                                 a[i] = a[i] ^ a[min];
                                                                 //交换a[i]和a[min] 
                        }
                        
                }
        }
        
        num_max = a[3] * 1000 + a[2] * 100 + a[1] * 10 + a[0];
        num_min = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];
        num_new = num_max - num_min;
        cout  << "  " << num;
        cout << " 重组最大数为:" << num_max << ",重组最小数为:" << num_min;
        cout << ",生成数为:" << num_new << endl;
}

/*** 计算卡布列克数 ***/
void calculate(){
        while (num_new != 6174){
                resolve(num_new);
                sort_recombine(num_new);
                calculate();
        }
}

int main(){
        int num = get_num();        //输入四位数 
        resolve(num);                         //输入的数进行分解 
        sort_recombine(num);        //分解后的数字进行排序及重组  
        calculate();                        //计算卡布列克数 
        return 0;
}


发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wanmei 发表于 2015-4-17 23:24
菜鸟路过,连楼主说的什么都不知道
小吾 发表于 2015-4-17 23:38
 楼主| Thorny_Devil 发表于 2015-4-18 02:07
 楼主| Thorny_Devil 发表于 2015-4-18 02:08

共同进步
羽幻倾城 发表于 2017-3-5 19:17
没有排除各个位上的数字不相同
loong96 发表于 2017-3-6 09:57 来自手机
楼主棒棒的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 04:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表