关于一个分离1~32767之间整数的一个C程序的研究
2008-07-16 12:24
197 查看
题目:开发一个程序,编写一个函数,输入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
以下是我编写的代码:
1#include<stdio.h>
2#include<math.h>
3
4void divideNumber( int number );
5
6main()
7
/**//* show the divided numbers */
void divideNumber( int number ){
int counter = 1; // record the digits.
int temp;
//How many digit in number?
temp = number;
while ( temp / 10 )
{
temp /= 10;
counter++;
}// counter has recorded the digits.
while ( counter )
{
printf( "%d ", number / (int)pow( 10, counter - 1 ) );
number %= (int)pow( 10, counter - 1 );
counter--;
}
printf( "\n" );
}
后记:今天一个同学的同学想让我帮忙看看他编写的连连看程序有什么问题,给我的只有一大堆代码。这让我无从下手,我想看的是他的设计思想和算法,我认为这比代码要重要的多。因为在我看来如果有了设计思想和算法,任何编程语言就都无所谓了(就是说哪一种语言都可以编写出来)。这虽然是一道小题,但是我还是想强调一下设计思想和算法的重要性。
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
以下是我编写的代码:
1#include<stdio.h>
2#include<math.h>
3
4void divideNumber( int number );
5
6main()
7
/**//* show the divided numbers */
void divideNumber( int number ){
int counter = 1; // record the digits.
int temp;
//How many digit in number?
temp = number;
while ( temp / 10 )
{
temp /= 10;
counter++;
}// counter has recorded the digits.
while ( counter )
{
printf( "%d ", number / (int)pow( 10, counter - 1 ) );
number %= (int)pow( 10, counter - 1 );
counter--;
}
printf( "\n" );
}
后记:今天一个同学的同学想让我帮忙看看他编写的连连看程序有什么问题,给我的只有一大堆代码。这让我无从下手,我想看的是他的设计思想和算法,我认为这比代码要重要的多。因为在我看来如果有了设计思想和算法,任何编程语言就都无所谓了(就是说哪一种语言都可以编写出来)。这虽然是一道小题,但是我还是想强调一下设计思想和算法的重要性。
相关文章推荐
- 用java语言编写一个可以求20个范围在1-100之间随机整数和的程序。
- 编写程序,分离出一个实数的整数部分与小数部分,要求用函数完成
- 通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。 输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。 补充说明: 1、操作数为
- 设计程序,单击【随机数】按钮,使用Math对象的random函数产生一个0-100之间(含0-100)的随机整数,并在对话框中显示,如下图。单击【计算】按钮,计算该随机数的平方、平方根和自然对数,保留两位小数,并在对话框中显示,如下图。
- 转: 编写程序,分离出一个实数的整数部分与小数部分,要求用函数完成
- 借助 数组 实现一个关于大整数乘法的 c 程序
- ITEXT实例学习与研究(二) 之 创建一个细长的浅黄色背景的页面以及纵向页面与横向页面之间的切换
- 关于一个选举的票数统计程序,每一位候选人的记录内容均为字符0或1,1表示此人被选中,0表示此人未被选中,若一张选票选中人数大于5个人时被认为无效的选票。
- CPP第七章第三题:编写一个程序。该程序读取整数,直到输入0.输入终止后,程序应该报告输入的偶数(不包括0)总个数、偶数的平均值,输入的奇数总个数以及奇数平均值
- 简单LinuxC程序关于加密(将任意长字符转换为定长整数)
- 只是一个关于表白的小程序而已,如果你不知道怎么拒绝我,那就来掐死我吧。
- 一个关于投票的研究
- 一个关于文件读写的小程序
- 小程序大问题,MSDN中一个小小示例所带来的疑问,一个关于DataList的一个简单应用
- 由一个简单的客户端间TCP/UDP通信程序引发的关于设计模式的思考
- 黑马程序员_一个小程序的发现-关于#define与C的内存
- 一个程序详细研究DataReader(转)
- IntegerUtils :一个关于整数操作的工具类
- 一个sql提问,引起的研究。关于union all 中,嵌套查询和直接查询的效率比较。
- 关于Ax51的一个小程序(跟8086好像啊~~~怀念自学8086的那段苦日子)