习题5-4
#include <stdio.h>
#include <string.h>
int main(){
int a=0,b=0,c=0,d=0;
char x;
while(scanf("%c",&x)&&x!='\n'){
if((x>='a'&&x<='z')||(x>='A'&&x<='Z')) a++; //是字母
else if(x==' ') b++; //是空格
else if(x>='0'&&x<='9') c++; //是数字
else d++; //是其他字符
}
printf("字母数: %d\n空格数: %d\n数字数: %d\n其他字符数 %d",a,b,c,d);
return 0;
}
习题5-5
#include <stdio.h>
int main(){
int a,n,sum,k;
printf("请输入a:\n");
scanf("%d",&a);
printf("请输入n:\n");
scanf("%d",&n);
sum=k=0;
for(int i=0;i<n;i++){
k=k*10+a;
sum+=k;
}
printf("%d",sum);
return 0;
}
习题5-7
#include <stdio.h>
int main(){
double sum=0;
for(int k=1;k<=100;k++) sum+=1.0*k;
for(int k=1;k<=50;k++) sum+=1.0*k*k;
for(int k=1;k<=10;k++) sum+=1.0/k;
printf("%lf",sum);
return 0;
}
习题5-8
#include <stdio.h>
int main(){
for(int a=1;a<=9;a++) //百位
for(int b=0;b<=9;b++) //十位
for(int c=0;c<=9;c++) //个位
if(a*a*a+b*b*b+c*c*c==a*100+b*10+c*1)
printf("%d\n",a*100+b*10+c*1);
return 0;
}
习题5-9
#include <stdio.h>
int main(){
for(int n=1;n<=1000;n++){
int sum=0; //因子之和
for(int i=1;i<n;i++){
if(n%i==0) sum+=i; //i可被n整除,则i为n的因子
}
if(sum==n){ //因子和等于数本身,为完数
printf("%d its factors are 1",n); //为了方便处理逗号,先输出一个1(1为任意正整数的因子)
for(int i=2;i<n;i++){ //从2开始找因子,因为1已经输出
if(n%i==0) printf(",%d",i); //先输出逗号再输出因子
}
printf("\n");
}
}
return 0;
}
习题5-10
#include <stdio.h>
int main(){
double sum=0;
int a=1,b=2,c=0; //a为分母,b为分子,c为中转用的变量
for(int i=0;i<20;i++){
sum+=1.0*b/a;
c=a+b;
a=b;
b=c;
}
printf("%lf",sum);
return 0;
}
习题5-11
#include <stdio.h>
int main(){
double h=100.0,sum=100.0; //初始高度100m
//倒推法,从第十次往前算
for(int i=10;i>0;i--){
sum+=h;
h/=2;
}
printf("共经过的米数为 %lf , 最后一次弹跳高度为 %lf",sum,h);
return 0;
}
习题5-12
#include <stdio.h>
int main(){
int sum=1;
for(int i=0;i<9;i++)
sum=(sum+1)*2;
printf("%d",sum);
return 0;
}
习题5-13
#include <stdio.h>
#include <math.h> //用它的abs求绝对值
int main(){
double x,y,a;
printf("请输入a:\n");
scanf("%lf",&a);
x=a;
y=0.5*(x+a/x);
while(abs(x-y)>0.00001){ //abs取绝对值,再判断是否满足精确值要求
x=y;
y=0.5*(x+a/x);
}
printf("%lf",y);
return 0;
}
习题5-14
牛顿迭代法参考资料
#include <stdio.h>
int main(){
//原式为2*x*x*x-4*x*x+3*x-6
//导数式为6*x*x-8*x+3
double x=1.5;
while(2*x*x*x-4*x*x+3*x-6!=0)
x=x-(2*x*x*x-4*x*x+3*x-6)/(6*x*x-8*x+3);
printf("%lf",x);
return 0;
}
习题5-15
二分法参考资料
#include <stdio.h>
int main(){
double a=-10.0,b=10.0,c,y,x;
while(c=(2*x*x*x-4*x*x+3*x-6)){
if(c<0) a=(a+b)*0.5; //c小于目标值,区间向右半部分精确
else b=(a+b)*0.5; //c大于目标值,区间向右半部分精确
x=(a+b)*0.5;
}
printf("%lf",x);
return 0;
}
附加题1
#include <stdio.h>
int main(){
int sum=0;
for(int a=0;a*3<=45;a++) //3元的鸡儿
for(int b=0;a*3+b*2<=45;b++) //2元的鸡儿
for(int c=0;a*3+b*2+c<=45;c++) //1元的鸡儿
if(a*3+b*2+c==45) sum++;
printf("%d",sum);
return 0;
}
附加题2
#include <stdio.h>
#include <math.h>
#include <time.h>
int main(){
srand(time(0));
int a=rand()%100+1,b;
printf("输入一个数\n");
for(int i=1;i<=7;i++){
scanf("%d",&b);
if(a==b){
printf("你猜对了!\n");
return 0;
}
else if(a<b) printf("你猜大了\n");
else printf("你猜小了\n");
}
printf("你应经猜了七次,你输了\n");
return 0;
}