>第 2 章 常量、变量和表达式>表达式>习题

minsmart minsmart@msn.com
2009-05-23 10:36:51

# include <stdio.h>
int main (void)
{
   int x=17,y=4;
   printf ("x除以y等于%f \n",x*1.0/y);
}


宋劲杉 songjinshan@akaedu.org
2009-06-15 10:53:19

(x+n-1)/n


Laciq dd@qq.com
2009-06-21 11:50:30

我觉得如果把
hour = 11;
minute = 59;
写成
hour   = 11;
minute = 59;
代码更美观易读易于接受。
变量声明亦是如此。


Laciq dd@qq.com
2009-06-21 12:13:51

在printf中加入计算实际上是不符合结构化程序设计的。
很多情况下我们都不知道那个计算到底是在计算什么。
更好的方法是使用一个变量来保存计算结果。
之后再用printf输出这个变量的值。
建议添加这一点。


gmg gmg_211@163.com
2009-06-26 11:29:27

数学的魅力真是无穷呀,宋老师说的一点都没错


gmg gmg_211@163.com
2009-06-26 11:37:46

(x+n-1)/n=x/n+(n-1)/n 就是在原来结果的基础上加一个极限为1的小数,应该这么理解吧


宋劲杉 songjinshan@akaedu.org
2009-06-26 17:19:09

这个。。。我怎么没看明白你的理解。。。
我觉得这个问题不需要从小数和极限来理解吧,就是一个整数问题。


mmmcat jy28520@gmail.com
2009-10-19 17:15:09

如果输入的两个数字是30和2,那ceiling的结果就是15。可是如果按照(x+n-1)/n的算法那就是8了?。。。


mmmcat jy28520@gmail.com
2009-10-19 17:35:05

上面那个写错了应该是16


mmmcat jy28520@gmail.com
2009-10-19 18:20:35

我写的程序,宋老师帮忙看一下
#include <stdio.h>
#include <math.h>
int main(void)
{
float num1,num2;
float s1,s2,s3;
printf("Input the first number1:");
scanf("\n%f",&num1);
printf("\nInput the first number2:");
scanf("\n%f",&num2);
s1=(int)(num1/num2);
printf("\nS1=%f",s1);
s2=num1/num2;
printf("\nS1=%f",s2);
s3=s2-s1;
if (s3==0)
{
printf("\nRes is:%f",s2);
}
else printf("\nRes is:%f",s1+1);
}


ben ben@wiredcraft.com
2010-03-16 10:33:39

这样行不行?
#include <math.h>
#include <stdio.h>

int main(void) {
  double x = 16, n = 4;
  int res = ceil(x/n);
  printf("%d", res);
  return 0;
}


Kenyon Lee nongcuolee@yahoo.cn
2010-03-19 01:03:27

楼上的程序我运行了一下,但由于有math.h头文件的存在,需要在编译时加上-lm选项,请问这是为什么呢?请不吝赐教!


Andy Ho sixand@gmail.com http://blog.sixand.cn/
2010-05-21 14:34:00

老师帮忙看看我做的练习有没有做对。
各位也帮忙评评我做的有没有做对吧。谢谢。

[code]

#include <stdio.h>

int ReCeiling(int m)
{
	//printf("%d",m);
	return m;
}

int main()
{
	float x=17,n=4,m;
	int c;
	m=x/n;
	c=ReCeiling(m);
	if(m>c)c=m+1;
	printf("\nGet Ceiling is %d \n",c);
}


[/code]


rteta@yahoo.cn rteta@yahoo.cn
2010-06-10 16:47:49

我是新手,这个题目有谁知道答案的发一下 给参考下好吗?


王雪 giveareport@126.com
2010-07-02 21:40:59

本来老师给了答案,我也不好说什么,上面发了很多代码的同学我估计老师再有耐心也不会看下去的
(x+n-1)/n可以很好实现要求


wyf startfly@yahoo.cn
2010-12-19 21:40:27

#include <stdio.h>

void main()
{
	int first,second,result;

	printf("first=");
	scanf("%d",&first);
	printf("second=");
	scanf("%d",&second);

	result = first*1.0/second > first/second ? first/second + 1 : first/second;
	printf("result=%d\n",result);
}


rufeng newingc@gmail.com http://www.xin-e.cc/
2011-01-08 20:56:49

其实,这仅仅是一个初级的数学题,和C没有任何关系。

记得大学时有个老师说过:
计算机专业是1/4个数学专业。
由于中国计算机远远落后于英语国家,所以计算机专业也有1/4是英语专业。
但是如果想要达到一种高度的话,必须要以哲学的角度去考虑问题,所以计算机专业也含有1/4的哲学专业。
最后的1/4就是本身了。

不管他说得对不对,至少数学对于编程是非常重要的吧。


小D 120762902@qq.com
2011-01-28 16:10:40

我是自己看的,现在好像刚懂了一点可是距离自己编程还差的远呢!


crzdot crzdot@gmail.com http://crzdot.com/
2011-02-27 21:16:53

不认为(x+n-1)/n是很理想的答案。
无疑增加了代码的维护难度。


lingshiying lingshiying@126.com
2011-03-08 15:11:45

我想知道的是老师是怎么思考得到这个
(X+n-1)/n这个结果的,有哪位可以说一下这个思路吗??


麦芒 maimang9@163.com
2011-09-06 23:15:19

Dear lingshiying
here is one way to understand it

if a % b = c, a / b = d, 
so a = b * d + c;

if c >= 1
  e = c + b -1;// e >= b
so (a + b - 1) / b is ceiling


rock keke9997@163.com
2011-09-19 12:57:09

膜拜宋老师 哈哈 自己加油啊


rock keke9997@163.com
2011-09-19 13:08:05

的确是个单纯的数学问题,整数取模问题。


Solin solinsun@gmail.com
2011-10-03 02:52:54

#include <stdio.h>

int main(void)
{
   int x = 17, n = 4;

   printf("Floor : %d\n",x/n);
   printf("*** : %d\n",x%n);
   printf("Ceiling : %d\n",x/n+x%n);

   return 0;
}


Leo zlchina1989@sina.com http://blog.csdn.net/zlchina1989
2011-10-12 23:38:07

/* 1、假设变量x和n是两个正整数,我们知道x/n这个表达式的结果要取Floor,
 * 例如x是17,n是4,则结果是4。如果希望结果取Ceiling应该怎么写表达式呢?
 * 例如x是17,n是4,则结果是5;x是16,n是4,则结果是4。
 */

#include <stdio.h>

int ceiling(int dividend, int divisor);

int main (void)
{
    int x, n;
    x = 17;
    n = 4;
    printf ("%d\n", x / n);
    printf ("%d\n", ceiling(x, n));

    x = 16;
    n = 4;
    printf ("%d\n", ceiling(x, n));

    x = 30;
    n = 2;
    printf ("%d\n", ceiling(x, n));
    return 0;
}

int ceiling(int dividend, int divisor)
{
    int v = 0, t = 0;
    v = dividend % divisor;
    if ( v != 0)
        t = dividend / divisor + 1;
    else
        t = dividend / divisor;
    return t;
}


zhangcoder zhangyan1987124@163.com
2011-12-04 10:04:09

楼上的做法都把问题复杂化了,题目的要求是用一个表达式解决问题。

(x+n-1)/n就够了。
如果x/n正好除尽,n-1因为Floor被舍去;
如果x/n有余数,那么这个余数肯定大于等于1且小于n,于是这个多出来的部分加上n-1得出的值一定大于n且小于2n。相当于x/n + 1。

Bingo!问题解决!


caozhije czj627@126.com
2011-12-22 20:37:30

(x+n-1)/n=x/n+1-1/n
情况1. x/n要么正好等于一个整数。
情况2. x/n要么等于一个整数加一个大于等于1/n的小数。
以上是数学分析

以下是c语言分析
由情况1.得:(x/n+1-1/n)表达式的值为x/n的商加1。因为1/n的值为0

由情况2.得:(x/n+1-1/n)表达式的值为x/n的整数部分加1。因为(一个大于等于1/n的小数减1/n)的值为0


如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!