
C程序设计(第四版)(谭浩强)第二章课后习题答案.pdf
8页C程序设计 (第四版 )(谭浩强 )第 2 章课后习题答案算法程序的灵魂P017 2.1 计算机 1-5相乘的积 . #include int main() int i,s=1; / 在执行数值操作前一定要先有个初值. for (i=1;i6;i+) / 这里是到 6. s=s*i; / 相乘 printf(The sum is %d .n,s); return 0; #include / 作出要求 : 换成 1到 11间奇数相乘 .int main() int i,s=1; / 在执行数值操作前一定要先有个初值. for (i=1;i12;i+) / 这里是到 , 但题目要求的是取单数. 也可以是 i=i+2 if (i%2!=0) /i对取模 , 值为非为奇数; 为则为偶数 . s=s*i; else continue; / 跳过这个 for 循环的这一次, 执行下一次 . printf(The sum is %d .n,s); return 0; P019 2.2 按要求输出 80分以上的学生信息. 暂时没法做 . P019 2.3 判断 2000-2500 年中的闰年 ,并输出 . 年的概念是地球围绕太阳一周的时间(所谓公转周期)称为一年,这个周期是相当稳定的,很长时间也不会变动1秒,但是真正的一年是365.2423天(目前)。
所以,如果每年定义为365天的话,1年就会多出0.2423天,4年就会多出0.9692天,非常接近1天,这样闰年就出现了,也就是每4年要有1年设置为366天,来抵消这多出的1天规则为: 1)如果年份能被4整除,则该年计为闰年;可是,假如不做调整的话,当400年的时候,累计才多出96.92天,接近于多出97天,闰年的设置却多出来100天,所以要在400年内,再撤销3个闰年怎么撤销呢?就有了下面这个规则: 2)如果年份能被100整除,则不计为闰年;问题又来了,400年里有4个100年吧,去掉后四个100年后,又少了一个,所以再加一个规则就是: 3)如果年份能被400整除,则计为闰年简单说来每400 年里设置了 97个闰年,也就是 400里的前 3个 100 年不设置闰年,误差被调整到400年仅有 0.08 天include int main() int i; for (i=2000;i=2200;i+) if (i%4=0 & i%100!=0)|i%400=0) / 闰年的经典判断条件. printf(%d is a leap year !n,i); else printf(%d is not a leap year !n,i); P020 2.4 求(1)-(1/2)+(1/3) +(1/99)-(1/100) 的值 . #include int main() float sign=1 , sum=0 , deno , term ; / 关于有小数的计算应该用float. for (deno=1;deno=100;deno+) term=sign*(1/deno); /term临时值 ,sing 符号 ,deno 为分母 . sum=sum+term; / 第一次总全存储. sign=(-1)*sign; / 换号 . printf(The sum of deno(指定值 ) is %f .n,sum); return 0; / 若是到 100的话 , 结果为 0.68172 P021 2.5 得到一个大于 3的数 ,并判断是否为素数. #include int main() int i , num ,n ; / 像13,37, 这样只能让和它本身除以外, 没有其它除数的叫素数. printf(Please input a number :n); / 获取一个数值scanf( %d,&num); for (i=2;inum;i+) / 在到此数值间进行循环除, 如果除得尽 , 就不满足素数要求. if (num%i=0) / 除得尽 , 则不是 . n=1; break ; / 设置跳出 , 才不会执行多次. n=0; / 按程序走的话, 这里会执行多次, 不能用 printf语句 , 会输出多次 . if (n=0) / 单出口问题 , 虽然 n=0执行多次 , 但仍然是 n=0, 这样才会只输出一次. printf(It is do a prime number !); / 如果是 100-200 可以加个 ” %d ” ,nmu进去 . else printf(It is not a prime number !); return 0; 2.6-2.10要求用流程图表示上列算法. 2.11-2.16 要求用 N-S图表示上列算法. 还要伪代码P036 0.1 调换二个参数的值. #include int main() char a= a ,b= b ,c; c=a; a=b; b=c; printf(a now is %c , b now is %c !n,a,b); return 0; P036 0.2 输入 10 个数 ,并输出最大的那一个数. #include int main() int i,a10,s=0 ; printf(Please input 10 numbers :n); for (i=0;i=9;i+) scanf( %d,&ai); for (i=0;i=9;i+) if (sai) s=ai; printf(%d is the biggest number !n,s); return 0; P036 0.3 按大小顺序输出一些数. #include int main() int i , j , a4 , s=0 ; printf(Please input 5 numbers :n); / 此处要回车 . for (i=0 ; i=4 ; i+) scanf( %d,&ai); / 这是取多个数的代码, 可以用 while 控制取到 n 符为止 . for (i=0 ; i=3 ; i+) / 双重循环 , 先一个外循 , 再轮所有小循, 轮完后再下一个大循. for (j=i+1 ; jaj) / 如果成立 , 则对换 , 小于号表示降序排列, 大于号表示升序排列. s=ai; ai=aj; aj=s; for (i=0 ; i=4 ; i+) / 重新定义循环输出数组中新排列的数. printf(%d- ,ai); return 0; P036 0.4 求1 至100 的总合 . #include int main() int i , sum=0 ; / 这是一个简单的程序. for (i=0 ; i101 ; i+) sum=sum+i; printf(The sum of one to one hundred is %d !n,sum); return 0; P036 0.5 判断一个数能否同时被3和5整除 . #include int main() int n ; printf(Please input a number :n); scanf( %d,&n); if (n%3=0&n%5=0) / 关键句 , 用 并的符号 . printf (Can be devide by 3 and 5 !n); else printf (Can not be devide by 3 and 5 !n); return 0; P036 0.6 输出 100-200 间的素数 . /*第一种方法 .#include / 网络版本 , 采用调用函数和求根取素.#include/ 下面用到 sqrt,所以需要包含数据函数.sqrt是求根 , 属数学函数 . int main() / 学会一个程序采用” 主函数 +被调用函数 ” 的方式 , 会比较规范 . int i; for (i=100; i=200; i+) / 为了书写规范, 最好加上 ,以示清范围 .if (prime_number(i) = 1) /i是实参 . printf(%d ,i); return 0; int prime_number(double m) /m 是形参 . int j,k; k=( int )sqrt(m); / 求根 ,(int)是强制转换 , 求根里要是浮点型. for (j=2;j=k;j+) if (m%j=0) return 0; / 此值返回给主函数中的实参. return 1; /*第二种方法 .#include #include int main() int i; for (i=100;i=200;i+) / 指定至间 . if (prime(i)=1) / 这里 i 为实参 , 传入形参 j 中进行运算 , 然后再由形参j 带出返回 . printf (%d is the prime number !n,i); return 0; int prime(int j) /j是形参 , 用于接收实参i 给的值 . int m, n; m=(int )sqrt(j); for (n=2;n=m;n+) if (j%n=0) return 0; / 返回值 ,0 为不是素数 ,1 是素数 . return 1; /*第二种方法 .请仿照 2.5 来写 . P036 0.7 最大公约数和最小公倍数. #include/ 最大公约数用累除法, 除到无余数时的被除数是最大公约数. main () int m, n, c, d; int gcd(); / 这是最大公约数的缩写, 此处调用函数, 可以不写里面的实参. int lcm(); / 这是最小公倍数的缩写, 此处调用函数, 可以不写里面的实参. printf(Please input two number :n); scanf( %d %d,&m,&n); c=gcd(m,n); /c 获取最大公约数d=lcm(m,n); /d 获取最小公倍数printf(The GCD of %d and %d is : %d !n, m, n, c); printf(The LCM of %d and %d is : %d !n, m, n, d); return 0; int gcd( int x, int y) / 最大公约数 Greatest Common Divisor int temp; while (x%y!=0) temp=y; /y 在下一轮中作为除数, 即是下一轮中的X,所以先闪一边去. y=x%y; /x,y的余数作为下一轮中的Y, 由x%y 来取得 . x=temp; / 刚才 temp中存储了 y的值 , 现在拿出来作为下一轮中的X使用 . return y; / 这是每一轮中的被除数, 按原理来 , 这就是最大公约数, 即累除法的原理. int lcm( int x, int y) / 最小公倍数 Lowest Common Multiple int i, temp; if (xy) / 保证二者大的数在X上, 小的数在 Y上 . 小于号降序 , 大于号升序 . / 以下为经典三行码, 实现两个数的互换. temp=x; x=y; y=temp; for (i=1; i=y; i+) / 设定一个区间, 从1至小的数之间的循环. if (!(x*i)%y) / 除得尽为零 , 非零为真 , 则成立并返回. / 如此往复 , 直到取模无余数, 那么小的数 X乘以区间当前的I 值 , 就是最小公倍数. return x*i; 。












