C語言程序設計-筆記3-循環結構
例4-1 用格雷戈里公式求給定精度的π值。使用格雷戈里公式求π的近似值,要求精確到最后一項的絕對值小於給定精度eps。
=1--+-+…
#include<stdio.h>
#include<math.h>
int main(void)
{
int denominator,flag,i;
double eps,item,pi;
printf("Enter eps:");
scanf("%lf",&eps);
i=1;
flag=1;
denominator=1;
item=1.0;
pi=0;
while(fabs(item)>=eps)
{
pi=pi+item;
i++;
flag=-flag;
denominator=denominator+2;
item=flag*1.0/denominator;
}
pi=pi+item;
pi=pi*4;
printf("pi=%.4f\n",pi);
printf("i=%d\n",i);
return 0;
}
例4-2 統計一批學生的平均成績與不及格人數。更改例3-3。從鍵盤輸入一批學生的成績,計算平均成績,並統計不及格學生的人數。
#include<stdio.h>
int main(void)
{
int count,num;
double score,total;
num=0;
total=0;
count=0;
printf("Enter scores:");
scanf("%lf",&score);
while(score>=0)
{
total=total+score;
num++;
if(score<60)
{
count++;
}
scanf("%lf",&score);
}
if(num!=0)
{
printf("Average is %.2f\n",total/num);
printf("Number of failures is %d\n",count);
}
else
{
printf("Average is 0\n");
}
return 0;
}
例4-3 統計一個整數的位數。從鍵盤讀入一個整數,統計該數的位數。例如,輸入12345,輸出5;輸入-99,輸出2;輸入0,輸出1。
#include<stdio.h>
int main(void)
{
int count,number,t_number;
count=0;
printf("Enter a number:");
scanf("%d",&number);
t_number=number;
if(number<0)
{
t_number=-t_number;
}
do{
count++;
t_number=t_number/10;
}while(t_number!=0);
printf("It contains %d digits.\n",count);
return 0;
}
例4-4 逆序輸出一個整數的各位數字。輸入一個整數,將其逆序輸出。例如,輸入12345,輸出54321.
#include<stdio.h>
int main(void)
{
int number;
printf("Enter a number:");
scanf("%d",&number);
do{
printf("%d ",number%10);
number=number/10;
}while(number!=0);
return 0;
}
例4-5 判斷一個整數是否為素數。輸入一個正整數m,判斷它是否為素數。素數就是只能被1和自身整除的正整數,1不是素數,2是素數。
#include<stdio.h>
#include<math.h>
int main(void)
{
int i,limit,m;
printf("Enter a number:");
scanf("%d",&m);
if(m<=1)
{
printf("No!\n");
}
else if(m==2)
{
printf("%d is a prime number!\n",m);
}
else
{
limit=sqrt(m)+1;
for(i=2;i<=limit;i++)
{
if(m%i==0)
{
break;
}
}
if(i>limit)
{
printf("%d is a prime nuber!\n",m);
}
else
{
printf("No!\n");
}
}
return 0;
}
例4-6 猜數游戲。更改例3-1簡單的猜數游戲。輸入你所猜的整數(假定為1-100),與計算機產生的被猜數比較,若相等,顯示猜中;若不等,顯示與被猜數的大小關系,最多允許猜7次。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int count=0,flag,mynumber,yournumber;
srand(time(0));
mynumber=rand()%100+1;
flag=0;
while(count<7)
{
printf("Enter your number:");
scanf("%d",&yournumber);
count++;
if(yournumber==mynumber)
{
printf("Lucky you!\n");
flag=1;
break;
}
else if(yournumber>mynumber)
{
printf("Too big\n");
}
else
{
printf("Too small\n");
}
}
if(flag==0)
{
printf("Game Over!\n");
}
return 0;
}
注:srand(time(0))是以當前時間,秒為單位,取種子,rand()以取的種子,產生隨機數。實現每秒產生的隨機數都不同的效果。
例4-7 使用函數求階乘和。輸入一個正整數n(n<=16),計算1!+2!+3!+…+n!。要求定義和調用fact(n)計算n的階乘,如果n是非負數,則該函數返回n的階乘,否則返回0。
//使用函數計算階乘和
#include<stdio.h>
double fact(int n);
int main(void)
{
int i,n;
double sum;
printf("Enter n:");
scanf("%d",&n);
sum=0;
for(i=1;i<=n;i++)
{
sum=sum+fact(i);
}
printf("1!+2!+...+%d!=%.0f\n",n,sum);
return 0;
}
double fact(int n)
{
int i;
double result;
if(n<0)
{
return 0;
}
result=1;
for(i=1;i<=n;i++)
{
result=result*i;
}
return result;
}
例4-8 求最值問題。輸入一批學生的成績,找出最高分。
#include<stdio.h>
int main(void)
{
/*
int i,mark,max,n;
printf("Enter n:");
scanf("%d",&n);
printf("Enter %d marks:",n);
scanf("%d",&mark);
max=mark;
for(i=1;i<n;i++)
{
scanf("%d",&mark);
if(max<mark)
{
max=mark;
}
}
printf("max=%d\n",max);*/
int mark,max;
printf("Enter marks:");
scanf("%d",&mark);
max=mark;
while(mark>=0)
{
if(max<mark)
{
max=mark;
}
scanf("%d",&mark);
}
printf("max=%d\n",max);
return 0;
}
例4-9 斐波那契數列問題。輸入正整數n(1<=n<=46),輸出斐波那契數列的前n項:1,1,2,3,5,8,13,…,每行輸出5個。斐波那契數列就是滿足任一項數字是前兩項的和(最開始兩項均定義為1)的數列。
#include<stdio.h>
int main(void)
{
int i,n,x1,x2,x;
printf("Enter n:");
scanf("%d",&n);
if(n<1 || n>46)
{
printf("Invalid.\n");
}
else if(n==1)
{
printf("%10d",1);
}
else
{
x1=1;
x2=1;
printf("%10d%10d",x1,x2);
for(i=3;i<=n;i++)
{
x=x1+x2;
printf("%10d",x);
if(i%5==0)
{
printf("\n");
}
x1=x2;
x2=x;
}
}
return 0;
}
例4-10 素數問題。輸入2個正整數m和n(1<=m<=n<=500),輸出m到n之間的全部素數,每行輸出10個。素數就是只能被1和自身整除的正整數,1不是素數,2是素數。
#include<stdio.h>
#include<math.h>
int main(void)
{
int count,i,k,flag,limit,m,n;
printf("Enter m n:");
scanf("%d%d",&m,&n);
count=0;
if(m<1||n>500||m>n)
{
printf("Invalid.\n");
}
else
{
for(k=m;k<=n;k++)
{
if(k<=1)
{
flag=0;
}
else if(k==2)
{
flag=1;
}
else
{
flag=1;
limit=sqrt(k)+1;
for(i=2;i<=limit;i++)
{
if(k%i==0)
{
flag=0;
break;
}
}
}
if(flag==1)
{
printf("%6d",k);
count++;
if(count%10==0)
{
printf("\n");
}
}
}
}
return 0;
}
例4-11 搬磚問題。已知男人一人搬3塊,女人一人搬2塊,小孩兩人搬1塊。如果想用n人正好搬n塊,問有哪些搬法。
#include<stdio.h>
int main(void)
{
int n,men,women,children,cnt;
printf("Enter n:");
scanf("%d",&n);
cnt=0;
/*
for(men=0;men<=n;men++)
{
for(women=0;women<=n;women++)
{
for(children=0;children<=n;children++)
{
if(men+children+women==n && men*3+women*2+children*0.5==n)
{
printf("men=%d,women=%d,children=%d\n",men,women,children);
cnt++;
}
}
}
}
if(cnt==0)
{
printf("None\n");
}*/
int limit_m=n/3;
int limit_n=n/2;
cnt=0;
for(men=0;men<=limit_m;men++)
{
for(women=0;women<=limit_n;women++)
{
children=n-men-women;
if(men*3+women*2+children*0.5==n)
{
printf("men=%d,women=%d,children=%d\n",men,women,children);
cnt++;
}
}
}
return 0;
}
例4-12 找零錢問題。有足夠數量的5分、2分和1分的硬幣,現在要用這些硬幣來支付一筆小於1元的零錢money,問至少要用多少個硬幣?輸入零錢,輸出硬幣的總數量和相應面額的硬幣數量。
#include<stdio.h>
int main(void)
{
int n1,n2,n5,money,flag=1;
printf("Enter money:");
scanf("%d",&money);
for(n5=money/5;n5>=0&&flag==1;n5--)
{
for(n2=(money-n5*5)/2;n2>=0&&flag==1;n2--)
{
for(n1=money-n5*5-n2*2;n1>=0&&flag==1;n1--)
{
if(n5*5+n2*2+n1==money)
{
printf("n5=%d,n2=%d,n1=%d,total=%d\n",n5,n2,n1,n5+n2+n1);
flag=0;
}
}
}
}
return 0;
}
//貪心法
參考資料
C語言程序設計/何欽銘,顏暉主編.---4版.---北京:高等教育出版社,2020.9