【練習21】計算自然數的和
0. 題目:
計算自然數的和
1. 分析:
練習使用 for 回圈結構,for 回圈允許一個執行指定次數的回圈控制結構,
2. 程式:
#include <stdio.h>
int main()
{
int i, iNum, iSum;
printf("輸入一個正整數: ");
scanf("%d",&iNum);
iSum = 0;
for(i=1; i <= iNum; i++)
{
iSum += i; // iSum = iSum + i;
}
printf("Sum = %d",iSum);
return 0;
}
3. 輸入輸出:
輸入一個正整數: 10
Sum = 55
【練習22】輸出九九乘法口訣表
0. 題目:
輸出九九乘法口訣表
1. 分析:
練習使用嵌套 for 回圈,對于嵌套的回圈結構,執行順序是從內到外:先執行內層回圈,再執行外層回圈,
2. 程式:
#include<stdio.h>
int main()
{
int i = 0; //外層回圈變數,控制行
int j = 0; //內層回圈變數,控制列
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
{
printf("%dx%d=%d\t",j,i,i*j);
//printf("%dx%d=%-4d",j,i,i*j); // %-4d 表示左對齊,4個字符位
}
printf("\n"); //每行輸出完后換行
}
return 0;
}
3. 輸入輸出:
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
【練習23】階乘
0. 題目:
階乘
1. 分析:
自然數 n 的階乘寫作n!,n!=1×2×3×...×n,
階乘也可以遞回方式定義:0!=1,n!=(n-1)!×n,
本題練習使用遞回方法,
2. 程式:
#include <stdio.h>
long int multiplyNum(int n); // 宣告子程式
int main()
{
int n;
printf("輸入一個整數: ");
scanf("%d", &n);
printf("%d! = %ld", n, multiplyNum(n));
return 0;
}
long int multiplyNum(int n)
{
if (n >= 1)
return n * multiplyNum(n-1); // n!=n*(n-1)!
else
return 1; // 0!=1
}
3. 輸入輸出:
輸入一個整數: 10
10! = 3628800
【練習24】斐波那契數列
0. 題目:
斐波那契數列
1. 分析:
斐波那契數列以兔子繁殖為例引入,從第3項開始每一項都等于前兩項之和,
可以使用回圈方法求解,也可以使用遞回方法求解,
2. 程式:
2.1 程式1:回圈方法
#include <stdio.h>
int main()
{
int i, iNum, iFibOne, iFibTwo, nextTerm;
printf("輸出幾項: ");
scanf("%d", &iNum);
printf("斐波那契數列: ");
iFibOne = 1;
iFibTwo = 1;
for (i = 1; i <= iNum; i++)
{
printf("%d, ", iFibOne);
nextTerm = iFibOne + iFibTwo;
iFibOne = iFibTwo;
iFibTwo = nextTerm;
}
return 0;
}
2.2 程式2:遞回方法
#include <stdio.h>
int Fibonacci(int n); // 宣告子程式
int main() //遞回方法
{
int i, iNum, iFibOne, iFibTwo, nextTerm;
printf("輸出幾項: ");
scanf("%d", &iNum);
printf("斐波那契數列: ");
for (i = 1; i <= iNum; i++)
{
printf("%d, ", Fibonacci(i));
}
return 0;
}
int Fibonacci(int n)
{
return n < 2 ? n : Fibonacci(n - 1) + Fibonacci(n - 2);
}
3. 輸入輸出:
輸出幾項: 10
斐波那契數列: 1, 1, 2, 3, 5, 8, 13, 21, 34,55,
【注意!】 雖然斐波那契數列經常被用做遞回方法的練習,但回圈方法的時間復雜度為O(n)、空間復雜度為O(1),都優于遞回方法的時間復雜度為O(n^2)、空間復雜度為O(n),求解斐波那契數列還可以使用通項公式方法、矩陣乘法實作,演算法的性能更好,
【練習25】求兩數的最大公約數
0. 題目:
求兩數的最大公約數
1. 分析:
求兩數的最大公約數,無論在求解演算法還是編程方法上都有很多方法,本例程針對初學者給出的是最簡單和便于理解的方法,
2. 程式:
#include <stdio.h>
int main()
{
int i, iNum1, iNum2, iGcd;
printf("輸入兩個正整數,以空格分隔: ");
scanf("%d %d", &iNum1, &iNum2);
for(i=1; i <= iNum1 && i <= iNum2; i++)
{
if(iNum1%i==0 && iNum2%i==0) // 判斷 i 是否為最大公約數
iGcd = i;
}
printf("%d 和 %d 的最大公約數是 %d", iNum1, iNum2, iGcd);
return 0;
}
3. 輸入輸出:
輸入兩個正整數,以空格分隔: 81 153
81 和 153 的最大公約數是 9
【練習26】求兩數最小公倍數
0. 題目:
求兩數最小公倍數
1. 分析:
本例程練習使用 while 回圈、簡化的條件判斷,
2. 程式:
#include <stdio.h>
int main()
{
int iNum1, iNum2, iMinMultiple;
printf("輸入兩個正整數,以空格分隔: ");
scanf("%d %d", &iNum1, &iNum2);
// 判斷兩數較大的值,并賦值給 minMultiple
iMinMultiple = (iNum1>iNum2) ? iNum1 : iNum2;
while(1) // 條件為 true
{
if( iMinMultiple%iNum1==0 && iMinMultiple%iNum2==0 )
{
printf("%d 和 %d 的最小公倍數為 %d", iNum1, iNum2,iMinMultiple);
break;
}
iMinMultiple++;
}
return 0;
}
3. 輸入輸出:
輸入兩個正整數: 45 120
45 和 120 的最小公倍數為 360
【練習27】 回圈輸出26個字母
0. 題目:
回圈輸出26個字母
1. 分析:
學習 for 回圈的格式:for(回圈變數賦初值;回圈條件;回圈變數增值)
其中常用的回圈變數型別是整數或浮點數,但也可以是其它型別,例如本例中的字符型變數,
此外,字符值是以 ASCII 碼形式存放在記憶體單元中,C語言允許字符變數參與數值運算,即用字符的 ASCII 碼參與運算,但 ASCII 碼參與運算時需要注意避免資料溢位等錯誤,
2. 程式:
#include <stdio.h>
int main()
{
char cInput, cOut;
printf("輸入 U 顯示大寫字母,輸入 L 顯示小寫字母: ");
scanf("%c", &cInput);
if(cInput== 'U' || cInput== 'u')
{
for(cOut = 'A'; cOut <= 'Z'; cOut++)
printf("%c ", cOut);
}
else if (cInput== 'L' || cInput== 'l')
{
for(cOut = 'a'; cOut <= 'z'; cOut++)
printf("%c ", cOut);
}
else
printf("Error! 輸入非法字符,");
return 0;
}
3. 輸入輸出:
輸入 U 顯示大寫字母,輸入 L 顯示小寫字母: L
a b c d e f g h i j k l m n o p q r s t u v w x y z
【練習28】判斷數字為幾位數
0. 題目:
判斷數字為幾位數
1. 分析:
學習 while 回圈的基本格式:while(運算式){陳述句塊}
2. 程式:
#include <stdio.h>
int main()
{
long lNum;
int iCount = 0;
printf("輸入一個整數: ");
scanf("%ld", &lNum);
printf("數字 %ld 是", lNum);
while(lNum != 0)
{
lNum /= 10;
iCount++;
}
printf(" %d 位數,", iCount);
return 0;
}
3. 輸入輸出:
輸入一個整數: 1234500
數字是 7 位數,
【注意!】 由于例程中 lNum 的值被改變,因此在前后使用了兩個 printf 陳述句進行輸出,
【練習29】 計算一個數的 n 次方
0. 題目:
計算一個數的 n 次方
1. 分析:
學習 while 回圈的基本格式:while(運算式){陳述句塊},
2. 程式:
#include <stdio.h>
int main()
{
int iBase, iExponent;
long lResult = 1;
printf("請輸入基數(整數): ");
scanf("%d", &iBase);
printf("請輸入指數(整數): ");
scanf("%d", &iExponent);
printf("power(%d,%d) ", iBase,iExponent);
while (iExponent != 0)
{
lResult *= iBase;
iExponent--;
}
printf(": %ld", lResult);
return 0;
}
3. 輸入輸出:
請輸入基數(整數): 2
請輸入指數(整數): 10
power(2,10) : 1024
【練習30】判斷回文數
0. 題目:
判斷回文數
1. 分析:
如果將一個自然數各位數字反向排列后所得到的自然數與原數相等,則稱為回文數,例如:1234321 是回文數,1234567不是回文數,
例程1 先對原數反序得到新數,再比較反序后的新數與原數的數值是否相等,這種方法思路簡單,容易理解,例程2 并不產生新數,直接比較原數的正向、反向對應位置字符是否相同,這種方法更加簡潔高效,
2. 程式:
2.1 程式1:比較反序后的新數與原數的數值是否相等
#include <stdio.h>
int main()
{
int iNum, iOriginal, iReversed, iRemainder;
printf("輸入一個整數: ");
scanf("%d", &iNum);
iOriginal = iNum;
iReversed = 0;
// 將輸入整數 iNum 的各位數字反向排列得到 iReversed
while( iNum!=0 )
{
iRemainder = iNum % 10; // 取個位數
iReversed = iReversed*10 + iRemainder;
iNum /= 10;
}
// 判斷反序后與原數是否相等
if (iOriginal == iReversed)
printf("%d 是回文數,", iOriginal);
else
printf("%d 不是回文數,", iOriginal);
return 0;
}
2.2 程式2:直接比較原數的正向、反向對應位置字符是否相同
#include <stdio.h>
#include <string.h> // 字符陣列操作
int main()
{
char cStr[99]; // 定義字符陣列(字串)
int i, iLen, iMark;
printf("輸入一個整數(或字串): ");
gets(cStr); // 可以輸入整數,但也是按字串保存
iMark = 1; // 判斷標志
iLen = strlen(cStr); // 字串長度
for(int i=0;i<iLen/2;i++)
{
if (cStr[i]!=cStr[iLen-i-1]) // 比較原數的正反向對應位置字符
iMark = 0;
}
if(iMark)
printf("%s 是回文串", cStr);
else
printf("%s 不是回文串", cStr);
return 0;
}
3. 輸入輸出:
輸入一個整數: 1230321
1230321 是回文數
著作權說明:
題目和例程 源于 菜鳥教程,作者重新撰寫了程式、注釋和算例,并增加了難點分析,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/276537.html
標籤:C
