18.12.09-C语言练习:黑洞数Kaprekar问题

18.12.09-C语言练习:黑洞数Kaprekar问题,第1张

18.12.09-C语言练习:黑洞数 / Kaprekar问题

题目:

程序:

 #include <stdio.h>

 int main(void) {
int n, a, b, c, t, A, B;
printf("输入一个三位数整数:");
scanf("%d",&n);
do{
/*a, b, c 分别是百位数,十位数,个位数*/
a = n/;
b = (n%)/;
c = (n%);
/* 百位数,十位数,个位数按照从大到小的顺序重排,以便下一步中求重排后的最大值A和最小值B*/
if(a<b) {
t = a; a = b; b = t;
}
if(a<c) {
t = a; a = c; c = t;
}
if(b<c) {
t = b; b = c; c = t;
}
/*从排后的最大数A与最小数B*/
A = a * + b * + c;
B = c * + b * + a;
/*将最大数与最小数的差,重新赋给变量n,以便做循环判断或下次循环使用*/
n = A - B;
/*输出过程*/
printf("%d - %d = %d\n", A, B, n);
} while(n!= && n!=);
return ;
}

程序说明:

1. 程序大体思路可以看程序中注释,大体分为两个步骤:输入和循环中计算。


其中循环中计算过程分为这么几个步骤:求个位十位百位上三个数字;个位十位百位三个数字按从大到小排列;求得重排后的最大值和最小值;求差和输出。


2. 难点在于:(1)求个位十位百位数字;(2)确定循环变量n;(3)黑洞数算法计算过程的程序表达。


3. 关于循环变量n: 因为算法中要求的是重排后数字的最大值与最小值之差。


所以n是循环变量。


运行结果:

错误程序:

错误或可优化部分分析:

1. (错误)变量名混用导致棋艺:c和C混用了,难以分清c 和C的具体含义。


根据程序理解可能是:(1)个位十位百位三个数字中的一个。


(好像小写c是这个意思);(2)重排后的差。


(好像大写C是这个意思)。


但在while循环判断的时候用错了。


2. (可能是错误)个位十位百位计算过程应该向上移动若干行:这里是否是个错误,主要看你对算法实现的过程,还有就是算法中的循环变量使用的是哪个。


3. (可优化)定义的变量最好不要用double:因为这里要求的数字范围总是整数,并且不超过3位数,所以用 int 类型最方便。


用double虽然不算错误,但会在计算过程中转化为int类型,所以用double没必要。


在具体程序中根据具体类型选择适当的数据类型即可,不必使用更宽范围的类型。


4. (可优化)求个位、十位、百位数字计算的优化:(假设表达式中用的是重排后的差,下面说明中我改成了大写C)

a = ((int)C/100)%10;    (int)C/100 结果是百位数之前的部分,因为C是三位数,所以(int)C/100结果是百位数。


因为C是三位数,虽然这里没错但没必要再进行 %10 求余。


另外就是因为定义C是double类型,实际计算是用int类型,所以这里使用了强制类型转换,反而更麻烦。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/585950.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存