《C程式設計快速進階大學教程》第8章程式設計題
阿新 • • 發佈:2018-11-05
- 關於階乘的數值問題,嘗試用各種迴圈語句實現:
(1)編寫程式求n階乘。輸入一個正整數n,輸出其階乘 的值。
(2)編寫程式求階乘和。對於一個正整數m,輸出1~m的階乘和 。
(3)編寫程式求常量e的近似值,估算公式如下:
(4)編寫程式計算的 值,公式如下:
#include <stdio.h> #include <stdlib.h> #include <math.h> //輸入一個正整數n,輸出其階乘的值。 int factorial(int n){ int i; int fac = 1; for(i=1;i<=n;i++){ fac *= i; } return fac; } //求階乘和 int factorial_sum(int n){ int i; int fac; int fac_sum = 0; for(i=1;i<=n;i++){ fac = factorial(i); fac_sum += fac; } return fac_sum; } //求常量e的近似值 float ee(int n){ int i; float e=1.0; int fac; for(i=1;i<=n;i++){ fac = factorial(i); e = e + 1.0/fac; printf("%d \t %f \n",fac,e); } return e; } //計算的e^x值 float eex(double x,int n){ int i; float ex = 1.0; int fac; for(i=1;i<=n;i++){ fac = factorial(i); ex = ex + pow(x,i)/fac; } return ex; } int main() { printf("請輸入選擇的操作:\n"); printf("(1)求n階乘。\n (2)求階乘和\n(3)求常量e的近似值\n(4)計算的e^x值\n"); int secletion; scanf("%d",&secletion); switch(secletion){ case 1: { printf("求n階乘\n"); int n; scanf("%d",&n); int fac; fac = factorial(n); printf("%d\n",fac); break; } case 2: { printf("求階乘和\n"); int n; scanf("%d",&n); int fac_sum; fac_sum = factorial_sum(n); printf("%d\n",fac_sum); break; } case 3: { printf("求常量e的近似值\n"); int n; scanf("%d",&n); float e; e = ee(n); printf("%.6f\n",e); break; } case 4: { printf("計算的e^x值\n"); double x; int n; scanf("%lf%d",&x,&n); float ex; ex = eex(x,n); printf("%.6f\n",ex); break; } default: printf("輸入錯誤"); break; } return 0; }
#include <stdio.h> #include <stdlib.h> //方法1 float pi_1(){ float pi_4 = 0; int i=1; float flag = 1; int zf = 1;//判斷正負 while(flag > 1e-6){ flag = 1.0/(2*i-1); pi_4 += zf*(flag); zf = -zf; //printf("%.6f\t",flag); i++; } return 4*pi_4; } //方法2 double pi_2(){ double pi_2 = 1.0; int i=1; double flag = 1.1; while(flag-1 > 1e-10){ flag = (double) (2*i*2*i)/(double)((2*i-1)*(2*i+1)); printf("%.6lf\t",flag); pi_2 *= flag; i++; } return 2*pi_2; } int main() { printf("請輸入計算pi的方法:\n"); int sel; scanf("%d",&sel); switch(sel){ case 1: { printf("方法1求得的pi值為:%.6f\n",pi_1()); break; } case 2: { printf("方法2求得的pi值為:%.6lf\n",pi_2()); break; } default: printf("輸入錯誤\n"); break; } return 0; }
- 分別用窮舉法和迭代法求兩個整數的最大公約數。輸入兩個正整數m和n,程式設計求它們的最大公約數。
最簡單的求最大公約數演算法為遍歷法,即在小於兩數最小值的所有整數中尋找公約數,能將兩數整除的最大因子為最大公約數。為了加快搜尋速度,常採用輾轉相除法求最大公約數: m 與 n 的最大公約數等於 n 與 m%n 的最大公約數;用n和m%n替換原來的 m與n的值;直到n = 0時,當前 m的值為所求最大公約數。
例如,m = 24,n = 9時:
(1)24和 9 的最大公約數等於 ( 24 % 9 ) = 6 和 9 的最大公約數;
(2)9 和 6 的最大公約數等於 ( 9 % 6 ) = 3 和 6 的最大公約數;
(3)6 和 3 的最大公約數等於 ( 6 % 3 ) = 0 和 3 的最大公約數;
因此 24 和 9 的最大公約數等於 3。
#include <stdio.h>
#include <stdlib.h>
//窮舉法Maximum common divisor
int mcd_1(int m,int n){
int i;
for(i=m;i>=1;i--){
if(m%i == 0 && n%i==0){
break;
}
}
return i;
}
//迭代法
int mcd_2(int m,int n){
int t;
while(m!=0){
t = n%m;
n = m;
m = t;
}
return n;
}
int main()
{
printf("請輸入兩個數:\n");
int m,n;
scanf("%d %d",&m,&n);
if(m>n){
int t = n;
n = m;
m = t;
}else if(m == n){
printf("%d\n",m);
return 0;
}
printf("請輸入選擇的操作:1,窮舉法;2,迭代法\n");
int sel;
scanf("%d",&sel);
switch(sel){
case 1:
{
printf("%d\n",mcd_1(m,n));
break;
}
case 2:
{
printf("%d\n",mcd_2(m,n));
break;
}
default :
{
printf("輸入錯誤");
break;
}
}
return 0;
}
- 菲波那契在數學代表作《算盤書》提出了這樣的問題:有小兔一對,若在它們出生後第二個月成年,第三個月就有生殖能力,而有生殖能力的一對兔子每一個月都生一對兔子。設所生的一對兔均為一雌一雄,且均無死亡。問新生的一對兔子一年後可以繁殖成多少對兔子?該問題可以用菲波那契數列解決。
Fibonacci 數列:0,1,1,2,3,5,8,13,21,34,……
f0 = 0
f1 = 1
fn = fn-1 + fn-2 ( n >= 2 )
用迭代的方法輸出數列的前20項,每行輸出8個數。
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("輸入n(n>=2):\n");
int n;
scanf("%d",&n);
int f0 = 0;
int f1 = 1;
int fi =0;
int i=1;
while(i < n){
if(i==1){
printf("%d\t",f0);
}else if(i==2){
printf("%d\t",f1);
}else{
fi = f0 + f1;
f0 = f1;
f1 = fi;
printf("%d\t",fi);
}
if(i%8 == 0){
printf("\n");
}
i++;
}
return 0;
}
5.螢幕列印圖中的三角形圖案.
圖8.13 輸出三角形
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("選擇輸出的三角形型別:a,b,c,d\n");
char ch;
ch = getchar();
switch(ch){
case 'a':
{
int i;
int j;
for(i=1;i<=10;i++){
for(j=1;j<=i;j++){
printf("*");
}
printf("\n");
}
break;
}
case 'b':
{
int i;
int j;
for(i=10;i>=1;i--){
for(j=1;j<=i;j++){
printf("*");
}
printf("\n");
}
break;
}
case 'c':
{
int i,j,k;
for(i=10;i>=1;i--){
for(k=0;k<10-i;k++){
printf(" ");
}
for(j=i;j>=1;j--){
printf("*");
}
printf("\n");
}
break;
}
case 'd':
{
int i,j,k;
for(i=1;i<=10;i++){
for(k=0;k>10-i;k++){
printf(" ");
}
for(j=1;j<=i;j++){
printf("*");
}
printf("\n");
}
break;
}
default :
{
printf("輸入錯誤");
break;
}
}
return 0;
}
6.程式設計判斷一個數是否為素數,輸出n~m內的所有素數,並統計素數的個數。
#include <stdio.h>
#include <stdlib.h>
//判斷一個數是不是素數
int sushu(int n){
int i;
int flag = 1;
for(i=2;i<n;i++){
if(n%i == 0){
flag =0;
break;
}
}
return flag;
}
//2,輸出n~m內的所有素數
void sushu_2(int n,int m){
int i;
for(i=n;i<=m;i++){
int flag;
flag = sushu(i);
if(flag == 1){
printf("%d\t",i);
}
}
}
int main()
{
printf("請選擇操作:1,一個數是否為素數 2,輸出n~m內的所有素數\n");
int sel;
scanf("%d",&sel);
switch(sel){
case 1:
{
int n;
scanf("%d",&n);
int flag;
flag = sushu(n);
if(flag == 1){
printf("素數\n");
}else if(flag == 0){
printf("不是素數\n");
}
break;
}
case 2:
{
int n,m;
scanf("%d %d",&n,&m);
sushu_2(n,m);
break;
}
default :
{
printf("輸入錯誤");
break;
}
}
return 0;
}
- 輸入一個正整數,如果該數不是素數,則將其分解質因數,輸出所有的因子。
例如:輸入90,打印出90 = 2 * 3 * 3 * 5。
#include <stdio.h>
#include <stdlib.h>
//判斷一個數是不是素數
int sushu(int n){
int i;
int flag = 1;
for(i=2;i<n;i++){
if(n%i == 0){
flag =0;
break;
}
}
return flag;
}
//分解質因數
void zys(int n){
int i;
printf("%d=",n);
for(i=2;i<=n;i++){
while(n%i == 0){
if(n != i){
n = n/i;
printf("%d*",i);
}else{
n = n/i;
printf("%d",i);
break;
}
}
}
}
int main()
{
printf("請輸入一個數:\n");
int n;
scanf("%d",&n);
int flag = sushu(n);
if(flag == 0){
zys(n);
}else if(flag == 1){
printf("素數\n");
}
return 0;
}
- 輸入5位以內的任何數字,分離每一位的數值,並輸出各位的和。
如入輸入2345, 輸出2+3+4+5=14。
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("請輸入5位以內的數字:\n");
int n;
scanf("%d",&n);
int a[5]={0,0,0,0,0};
int count=0;
while(n != 0){
a[count] = n%10;
n = n/10;
count++;//最後的時候,多加了一個1
}
int i;
int sum=0;
for(i=count-1;i>0;i--){
printf("%d+",a[i]);
sum += a[i];
}
printf("%d",a[0]);
sum += a[0];
printf("=%d",sum);
return 0;
}
9[選作].程式設計實現猜數遊戲
由程式自動生成一個1到10之間隨機整數,請參加遊戲的人猜,遊戲者通過鍵盤輸入猜測的數字,如果猜對了則結束遊戲;否則輸出提示資訊,顯示所猜的數是太大還是太小。 遊戲結束後輸出猜字的次數。 若規定輸入猜測字的次數不得超過6次,若多於6次仍未猜中則自動結束遊戲,並輸出“輸局”的資訊。如果在遊戲過程中,玩家可以隨時終止遊戲,在提示玩家繼續輸入新的猜測數時,可由使用者選擇是否繼續進行遊戲。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int rn;
int guess;
rn = rand()%10+1;
int count;
int flag=0;
for(count=1;count<=6;count++){
printf("請猜一個1到10之間的數:(輸入-1結束遊戲)\n");
scanf("%d",&guess);
if(guess == rn){
printf("成功\n");
flag = 1;
break;
}else if(guess < rn && guess>=1){
printf("太小\n");
}else if(guess > rn){
printf("太大\n");
}else if(guess == -1){
printf("結束遊戲\n");
break;
}
}
if(count > 6 && flag == 0){
printf("*******************輸局*********************\n");
}
return 0;
}