`
superwulei
  • 浏览: 106297 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于一个分离1~32767之间整数的一个C程序的研究

阅读更多

题目:开发一个程序,编写一个函数,输入1~32767之间的整数,并把这个整数显示为一些列数字,每组数字都是用两个空格分开。例如,整数4562应该显示为:
4  5  6  2

华罗庚曾经说过,研究一个问题要从简单的入手,然后再从简单的向复杂问题入手。于是我就用一个特殊的例子下手,比如用1234这个数,最后输出的结果应该是1 2 3  4。怎么才能得到这个结果呢?使用除法的商和余数可以得到正确的结果。如下表
次数  被除数         除数          商       余数 
1      1234    /    1000    =    1......234
2        234    /    100      =   2......   34
3          34    /    10       =    3......    4
4            4    /    1         =    4......       0
可以看到前一次的余数作为了下一次的被除数,而商就是我们要输出的部分。于是可以得到算法:
1.被除数为1234,除数为1000;
2.输出被除数/除数的商和两个空格;
3.把被除数/除数的余数给被除数;
4.把除数/10的商给除数;
5.重复步骤2和步骤4,直到被除数为0;

非常荒唐的是,我的算法只能用于这个特殊的例子。以上的被除数是四位数所以我们才除以1000,如果是五位数我们就应该除以10000,三位数除以100,两位数除以10,1位数除以1。规律是除以10的n-1次方(n是用户输入整数的位数)但是如何确定用户输入的是位数呢?问题现在又转移到求位数上来了。这次还用1234这个整数作为切入的例子。1234是四位数,如何确定?
可以使用一个循环和一个计数器。
1234每次除以10,再将所得的商赋值给新的被除数。计数器记录循环的次数(每次循环自身累加1)
这样1234/10=123, 123/10=12, 12/10=1, 1/10=0, 直到商为零的时候循环结束,一共除了4次,这个4就是位数。
这是通用的。如果是五位数那么会除以5次,5就是位数,其他的位数是同样的道理。

返回到我的那个荒唐的算法中,让我们修改一下。
1. 求得用户输入数字(被除数)的位数;
2. 输出  被除数 / 10的[位数-1]次方的商和两个空格;
3. 步骤二中的余数作为被除数;
4. 把位数-1的值给位数;
5. 重复步骤2到步骤4,直到位数为0

以下是我编写的代码:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 #include < stdio.h >
 2 #include < math.h >
 3
 4 void  divideNumber(  int  number );
 5
 6 main()
 7 {
 8      int  num;
 9     printf(  " Enter a integer: "  );
10     scanf(  " %d " & num );
11     divideNumber( num );
12
13      return   0 ;
14 }

15
16 /**/ /*  show the divided numbers  */
17 void  divideNumber(  int  number ) {
18      int  counter  =   1 //  record the digits.
19      int  temp;
20
21      // How many digit in number?
22     temp  =  number;
23      while  ( temp  /   10  )
24      {
25         temp  /=   10 ;
26         counter ++ ;
27     }
//  counter has recorded the digits.
28
29      while  ( counter )
30      {
31         printf(  " %d   " , number  /  ( int )pow(  10 , counter  -   1  ) );
32         number  %=  ( int )pow(  10 , counter  -   1  );
33         counter -- ;
34     }

35     printf(  " \n "  );
36 }


后记:今天一个同学的同学想让我帮忙看看他编写的连连看程序有什么问题,给我的只有一大堆代码。这让我无从下手,我想看的是他的设计思想和算法,我认为这比代码要重要的多。因为在我看来如果有了设计思想和算法,任何编程语言就都无所谓了(就是说哪一种语言都可以编写出来)。这虽然是一道小题,但是我还是想强调一下设计思想和算法的重要性。

分享到:
评论

相关推荐

    正整数拆分C语言程序

    能够给出任意正整数的所有拆分情况和种数,注释详细,只用了一个嵌套函数。

    C语言成序设计__实现人民币小写金额与大写金额的转换

    C语言成序设计__实现人民币小写金额与大写金额的转换

    (c语言)数据结构教程

    例如:以三个带有次序关系的整数表示一个长整数时,可利用C语言中提供的整数数组类型,定义长整数为: typedef int Long_int [3] 二、数据类型 在用高级程序语言编写的程序中,必须对程序中出现的每个变量、常量或...

    语言程序设计课后习题答案

    C++是一个更好的C,它保持了C的简洁、高效、接近汇编语言、具有良好的可读性和可移植性等特点,对C的类型系统进行了改革和扩充,因此C++比C更安全,C++的编译系统能检查出更多的类型错误。 C++语言最重要的特点是...

    C语言二级考试经典排序程序代码再现!!!!

    //存储一个数的,个,十 ,百,千位的数 int b[5]; //存储千位 int i,j,k,temp,gew,shiw,baiw,qianw; printf("输入5个4位正整数,用空个隔开:\n"); for(i=0;i;i++) { scanf("%d",&temp); aa[i]=temp; } ...

    Python 2.5

    一个比较流行的办法是在Python中原型一个程序,直到你相信设计是正确的再换到C++中,一个更好的办法是将Python应用程序轮廓化,然后在C++中重写速度至关重要的部分。 &lt;br/&gt; &lt;br/&gt;一个调试工具 &lt;br/&gt;新...

    C程序范例宝典(基础代码详解)

    实例022 求一个正整数的所有因子 27 实例023 一元钱兑换方案 28 实例024 对调数问题 29 实例025 数平方和运算的问题 30 1.5 数组 31 实例026 逆序存放数据 32 实例027 相邻元素之和 33 实例028 选票...

    Objective-C2.0程序设计

    2.2 解释第一个程序 2.3 显示变量的值 2.4 小结 2.5 练习 第3章 类、对象和方法 3.1 到底什么是对象 3.2 实例和方法 3.3 用于处理分数的Objective-C类 3.4 @interface部分 3.4.1 选择名称 3.4.2 实例变量 3.4.3 类...

    练习P20入门版答案

    (3)如果C去了,D、E就只能去一个,且必须去一个;(4)B、C、D不能都去;(5)如果B去了,D、E就不能都去。编程找出此项任务该由哪三人去完成的所有组合。 9. 输入一个字符串,内有数字和非数字字符。如A123X456...

    c语言经典案例

    实例001 第一个C语言程序 2 实例002 一个完整的C语言程序 2 实例003 输出名言 3 实例004 用TC 2.0打开文件 4 实例005 计算正方形的周长 5 第2章 简单的C程序 6 实例006 输出一个正方形 7 实例007 输出一个三角形 8 ...

    C++大学教程,一本适合初学者的入门教材(part1)

    1.16 简单程序:两个整数相加 1.17 内存的概念 1.18 算术运算 1.19 判断:相等与关系运算符 1.20 新型头文件与名字空间 1.21 有关对象的思考 小结 术语 自测练习 自测练习答案 练习 第2章 控制结构 2.1 简介 ...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    通过我们已经学过的知识,你可以编写一个最简单的程序输出一个也许是程序世界中最有名的词语: echo "Hello World!"; ?&gt; First PHP page // Single line C++ style comment /* printing the message */ ...

    超级有影响力霸气的Java面试题大全文档

    重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,...

    ROS机器人操作系统入门 Tutorials CN版 20150726

    它是一个开源的元级操作系统(后操作系统),提供类似于操作系统的服务,包括硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间消息传递、程序发行包管理,它也提供一些工具和库用于获取、建立、编写和执行多...

    c代码-比较三个数大小,并按照从大到小排序

    c代码-比较三个数大小,并按照从大到小排序

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录 一个Java+ajax写的...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录 一个Java+ajax写的...

    MFC的程序框架剖析

    一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。...

    java源码包---java 源码 大量 实例

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

Global site tag (gtag.js) - Google Analytics