} 【4.33】参考答案: #include main( ) { int j; long n; /* 使用长整型变量,以免超出整数的表示范围 */ printf(\; scanf(\; for(j=999;j>=100;j--)/* 可能取值范围在999到100之间,j从大到小 */ if(n%j == 0 ) /* 若能够整除j,则j是约数,输出结果 */ { printf(\; break; /* 控制退出循环 */ } } 【4.34】参考答案: #define E 0.000001 main() { float x,y=1,s=0; printf(\; scanf(\; while(1/y>E) { s=s+1/y; y=y*x; } printf(\; } 【4.35】参考答案: #include main( ) { int class1, class2, class3; char ch; class1=class2=class3=0; /* 初始化分类计数器 */ do { ch=getch( ); switch(ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': class1++; break; /* 对分类1计数 */ case '+': case '-': case '*': case '/': case '%': case '=': class2++; break; /* 对分类2计数 */ default: class3++; break; /* 对分类3计数 */ } }while (ch!= '\\\\'); /* 字符'\\'在C程序中要使用转义符'\\\\' */ printf(\; } 【4.36】分析:程序的关键是怎样判断一个单词。由单词的定义已知它是用空格、制表符或换行符分隔开的,两个字符之间没有空格、制表符或换行符,则认为是一个单词中的两个字符。 参考答案: #define EOF -1 #define YES 1 #define NO 0
#include main( ) /* 对输入的行、字符和单词进行计数统计 */ { int c, nl, nc, nw, inword;
inword=NO; /* inword=NO 已处理的最后一个字符是空格、\\t或\\n */ /* inword=YES 已处理的最后一个字符不是空格、\\t或\\n */ nl=nc=nw=0; /* 行、字符、字计数器置0 */ while((c=getchar())!= EOF) { ++nc; /* 进行字符计数 */ if(c=='\\n' )
++nl; /* 进行行计数 */ if(c=='\\t'||c=='\\n'||c==' ')
inword=NO;/* 如果读入的字符是空格、\\t或\\n,则置inword为NO */ else /* 读入的字符不是空格、\\t或\\n */
if(inword==NO) /* 如果前一个字符是空格、\\t或\\n */ { inword=YES; /* 则读入的字符为一个单词的第一个字符*/ ++nw; /*置inword为YES,进行单词计数 */ } }
printf(\; /* 输出结果 */ }
【4.37】参考答案: #define E 0.000001 #include \main() { int i,k=1;
float x,y,t=1,s,r=1; printf(\;
scanf(\;
for(s=x,y=x,i=2;fabs(r)>E;i++) { t=t*(i-1); y=y*x*x; k=k*(-1); r=k*y/t/(2*i-1); s=s+r; }
printf(\; }
【4.38】参考答案: main() { int i; float s=0;
for(i=1;i<=100;i++) s=s+i;
for(i=1;i<=50;i++) s=s+i*i;
for(i=1;i<=10;i++) s=s+1.0/i;
printf(\; }
【4.39】参考答案: main() { int i; float s=1;
for(i=1;i<=20 && 1.0/i/(i+1)>0.001;i++) s=s+1.0/i/(i+1);
printf(\; }
【4.40】参考答案: #include main()
{ float x,eps,s,y=0,y0,t; int n,j;
printf(\; scanf(\; n=t=j=1; s=x;
do { y0=y;
if(n%2==0) y=y-s/t; else y=y+s/t;
s *= x*x; /* 求x的乘方 */ t *= (j+1)*(j+2); /* 求n! */ j += 2; n++;
}while( fabs(y0-y) > eps ); /* 控制误差 */
printf(\; /* 输出标准sin(x)的值 */ printf(\; /* 输出计算的近似值 */ }
【4.41】参考答案: main( )
{ int i,j,num,a[10]; for(i=0;i<10;i++)
{ printf(\; scanf(\;
for(j=i-1;j>=0&&a[j]>num;j--) a[j+1]=a[j]; a[j+1]=num; }
for(i=0;i<10;i++)
printf (\; }
【4.42】参考答案: main() { int n;
printf(\; scanf(\; while(n>0)
{ printf(\; n=n/10; } }
【4.43】参考答案: main() { int i,n;
long s1=0,s2=0;
printf(\; scanf(\; if(n>=0)
for(i=n;i<=2*n;i++) s1=s1+i; else
for(i=n;i>=2*n;i--) s1=s1+i; i=n; if(i>=0) while(i<=2*n) s2=s2+i++; else
while(i>=2*n) s2=s2+i--;
printf(\; }
【4.44】分析:据题意,阶梯数满足下面一组同余式: x≡1 (mod2) x≡2 (mod3) x≡4 (mod5) x≡5 (mod6) x≡0 (mod7) 参考答案: #include main()
{ int i=1; /* i为所设的阶梯数 */
while( !((i%2==1)&&(i%3==2)&&(i%5==4)&&(i%6==5)&&(i%7==0)) ) ++i; /* 满足一组同余式的判别 */ printf(\; }
【4.45】参考答案: main( ) { int i,n,a; for(i=0; ;i++) { if(i%8==1) { n=i/8; if(n%8==1)