本帖最后由 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;
}
|