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类型,所以这里使用了强制类型转换,反而更麻烦。
18.12.09-C语言练习:黑洞数 / Kaprekar问题的更多相关文章
- [CareerCup] 18.12 Largest Sum Submatrix 和最大的子矩阵
18.12 Given an NxN matrix of positive and negative integers, write code to find the submatrix with t ...
- QVM 实操记 - 18.12.28
视频回放地址:https://i.iamlj.com/mp4/QVM-IMC-12.27-1080P.mp4 目录 目录 常规开发部署流程 准备工作 开发准备 网站部署 操作步骤 重装系统 LANP环 ...
- Navicat Premium 12.0.18 / 12.0.24安装与激活
若使用Navicat Premium 12.1.8.0请转至Navicat Premium 12.1.8.0安装与激活,其实每个小版本更迭变化不大.另外最重要的是,请仔细阅读本文激活部分,总有一些人遇 ...
- 尚学python课程---12、python语言介绍
尚学python课程---12.python语言介绍 一.总结 一句话总结: 1.操作简单:简便计算:允许通过单个“import”语句后跟一个函数调用来完成复杂的计算.虽慢 2.库丰富:比如人工智能和 ...
- 2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串)
2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串) https://www.luogu.com.cn/problem/P2824 题意: 在 20 ...
- 统计C语言程序行数
补充前一篇中统计C语言程序行数的程序 写得比较匆忙,可能有些失误,等弄明白GitHub的用法并完善程序后再补充完整代码链接 没有写成函数,但经过简单修改可以作为一个计算或判断函数使用 判断算法主要为以 ...
- C语言函数參数传递原理
C语言中參数的传递方式一般存在两种方式:一种是通过栈的形式传递.还有一种是通过寄存器的方式传递的. 这次.我们仅仅是具体描写叙述一下第一种參数传递方式,第二种方式在这里不做具体介绍. 首先,我们看一下 ...
- 黑洞数--python
黑洞数:黑洞数又称陷阱数,是类具有奇特转换特性的整数.任何一个数字不全相同整数,经有限“重排求差”操作,总会得某一个或一些数,这些数即为黑洞数.“重排求差”操作即把组成该数的数字重排后得到的最大数减去 ...
- 18.12.02-C语言练习:韩信点兵
C语言练习:韩信点兵 题目说明:本题是中国经典问题,有多种解法,从数论课程角度看,是一个不定方程组,而且答案不唯一. 但这里采用程序解法,使用的是暴力破解.枚举可能的解,然后根据条件判断,满足所有条件 ...
随机推荐
- ulimit -c unlimited的使用(转载)
ulimit -c unlimited ulimint -a 用来显示当前的各种用户进程限制Linux对于每个用户,系统限制其最大进程数,为提高性能,可以根据设备资源情况,设置个Linux用户的最大进 ...
- Anaconda介绍、安装及使用教程
https://www.jianshu.com/p/62f155eb6ac5 Anaconda介绍.安装及使用教程 Python是一种面向对象的解释型计算机程序设计语言,其使用,具有跨平台的特点,可以 ...
- Hibernate 双向一对多映射
附代码: public class Order { private Integer id; private String OrderName; private Customer customer; p ...
- 项目部署到tomcat
准备工作 第一步 准备项目部署文件 准备项目中使用的数据库.sql文件. 准备项目程序(整个项目的war包文件) 第二步 安装运行环境 依次安装JDK.TOMCAT.MYSQL NAVICAT需要注意 ...
- Java try-cath-finally异常
Java 内置异常类 Java 语言定义了一些异常类在 java.lang 标准包中. 标准运行时异常类的子类是最常见的异常类.由于 java.lang 包是默认加载到所有的 Java 程序的,所以大 ...
- shell变量的使用及输入输出
1.shell 中变量名可以由字母,数字,下划线组成,但数字不能作为变量名的第一个数字 2.通过赋值符合“=” 来定义一个变量的值 如 myname='zhangjunjie' #字符串类型,不解析 ...
- 什么是 js 变量提升 (Javascript Hoisting)
Javascript是一门容易遭人误解的语言,但是它的强大毋庸置疑.个人觉得,要想深入理解Javascript语言,首先必须对其基本的概念(例如:Scope,Closure,Hoisting等)要真正 ...
- js 讲解
substring() 取文本中间 split() 分割文本 charcodeat() utf-8 tolowercase() 小写 正则是一个对象 正则 i 不区分大小写 escape(s ...
- SAP中的一些简称及简要介绍
SAP-(System Applications and Products) 基础部分: R/3系统内核.数据库.支持各类平台的接口.ABAP(Advanced Business Applicatio ...
- vuejs 70行代码实现便签功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...