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

本文探讨了一段存在变量名混乱和可能逻辑错误的程序,重点在于解析如何计算三位数整数的个位、十位和百位,并进行重排操作以求最大值与最小值差。作者指出了变量名C的使用不当,并提出优化建议,如使用整数类型而非double,以及调整计算步骤。同时,提供了错误分析和改进方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

c569053bbe94da04d0fc4bf3639bf238.png

程序:

1 #include

2

3 int main(void) {

4 int n, a, b, c, t, A, B;

5 printf("输入一个三位数整数:");

6 scanf("%d",&n);

7 do{

8 /*a, b, c 分别是百位数,十位数,个位数*/

9 a = n/100;

10 b = (n%100)/10;

11 c = (n%10);

12 /* 百位数,十位数,个位数按照从大到小的顺序重排,以便下一步中求重排后的最大值A和最小值B*/

13 if(a

14 t = a; a = b; b = t;

15 }

16 if(a

17 t = a; a = c; c = t;

18 }

19 if(b

20 t = b; b = c; c = t;

21 }

22 /*从排后的最大数A与最小数B*/

23 A = a * 100 + b * 10 + c;

24 B = c * 100 + b * 10 + a;

25 /*将最大数与最小数的差,重新赋给变量n,以便做循环判断或下次循环使用*/

26 n = A - B;

27 /*输出过程*/

28 printf("%d - %d = %d\n", A, B, n);

29 } while(n!=495 && n!=0);

30 return 0;

31 }

程序说明:

1. 程序大体思路可以看程序中注释,大体分为两个步骤:输入和循环中计算。其中循环中计算过程分为这么几个步骤:求个位十位百位上三个数字;个位十位百位三个数字按从大到小排列;求得重排后的最大值和最小值;求差和输出。

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

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

运行结果:

8858ae5702cc55a2a6fe24a960bce157.png

33dd9163b2aaccdf7137b935404b307b.png

ab9c19900bb773f94fff84cdbbd0a437.png

错误程序:

750f0c6795067660e85dd8a2871ba7f8.png

错误或可优化部分分析:

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://www.cnblogs.com/coder211/p/10090868.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值