第一篇:編程小結
編程小結
(一)一.累加:加數1+加數2+加數3+??+加數n(n個加數相加)假設我們用i表示我們的加數數目,例如:當i=9時,就表示加數9 模版:int i,sum=0;(注意:如果是分數或者小數sum就是float類型)
for(i=1;i<=n;i++)(注意:循環變量的初值和遞變規律,也有
可能是i--,或者i+=2等等){通項a;(通項:用一個通用的式子表示所有的加數)sum+=a;} printf(“%d”,sum);(注意:如果是float類型就是%f)
1、求1+2+3??+100的和,則通項a就是i。
分析:因為a就是i的值,所以這里不需要通項這一行了,因此整個大括號中間就只有一句話,所以大括號可以省略。整理之后就是: int i,sum=0;for(i=1;i<=100;i++)sum+=i;printf(“%d”,sum);
2、求2+4+6??+100的和。
分析:因為a就是i的值,所以這里不需要通項這一行了,因此整個大括號中間就只有一句話,所以大括號可以省略,再分析,再分析我們發現每個加數都是偶數,那么i的變化就是i+=2,并且i是從2開始變化,那么在賦值的時候就應該是i=2。整理之后就是: int i,sum=0;for(i=2;i<=100;i+=2)sum+=i;printf(“%d”,sum);
3、求1+3+5??+99的和。
分析:因為a就是i的值,所以這里不需要通項這一行了,因此整個大括號中間就只有一句話,所以大括號可以省略,再分析,再分析我們發現每個加數都是奇數,那么i的變化就是i+=2。整理之后就是: int i,sum=0;for(i=1;i<=100;i+=2)sum+=i;printf(“%d”,sum);
4、求1+5+9+13+17+??的前100項的和,則通項為j+4,則程序為: int i,sum=0,j=1;for(i=1;i<=100;i++){ sum+=j;j=j+4; } printf(“%d”,sum);因為加數的第一項是1,所以賦初值的時候j=1,然后加數進行變化,變成5加到sum里面,所以這里要將通項和求和這兩句話互換位置。
5、求1+4+9+16+??的前100項的和
分析可知:每個加數就是對應的加數數目的平方,則通項為i*i,則程序為: int i,sum=0;for(i=1;i<=100;i++)sum+= i*i;printf(“%d”,sum);
6、求1+(1+2)+(1+2+3)+(1+2+3+4)+??的前100項的和。
分析可知每一個加數本身又是一個累加的式子,進一步觀察可以發現,每個累加的式子都是加到這個加數所在的加數數目,即第35個加數就是1+2+3??+35,并且是在前面一個加數的基礎上加上這個加數所在的加數數目,也就是說第36個加數就是在前一個加數的基礎上加上36,即:1+2+3??+35+36。假設第k個加數是j,那么第k+1個加數就可以表示為j+(k+1),然后第k+2個加數就是j+(k+1)+(k+2)??那么我們的通項就可以表示為a=a+i,則程序為: int i,sum=0, a=0;for(i=1;i<=100;i++){ a+=i;sum+=a;} printf(“%d”,sum);
7、求1+1+2+3+5+8+13+21+??的前100項的和。
分析可知從第三個加數開始,每一個加數是其前兩個加數之和,假設第k個加數是m,第k+1個加數是n,然后第k+2個加數就是m+n,那么我們的通項就可以表示為a=m+n,但是要注意每次加數所對應的m和n不一樣,所以我們要在求出每個加數之后,找出其對應的m和n;再分析我們可以發現當前的n是下一次的m,當前的加數a是下一次的n,假設接著上面的推導,那么第k+3個加數就是n+(m+n),對應我們的通項a=m+n,理解前面一句話。則程序為: int i,sum=0, m=1,n=1,a;for(i=3;i<=100;i++){ a=m+n;sum+=a;m=n;n=a;} printf(“%d”,sum);
8、求1+1/2+1/3+??+1/100 分析可知每一個加數就是我們的加數數目的倒數,則通項a就是1/i,我們說循環變量i一般定義為整型,那么1/i的結果就是整型,這樣的話小數點后面的就會被省略,所以正確的應該寫為a=1.0/i,則程序為:
int i;float sum=0;for(i=1;i<=100;i++){a=1.0/i;sum+=a;} printf(“%f”,sum);
9、求1+1/2+2/3+3/5+5/8+??的前100項的和。
分析可從第三個加數開始觀察,每一個加數的分母是其前一個加數的分子和分母之和,每一個加數的分子是其前一個加數的分母。可以將第一個加數看成1/1,那么第二個加數也符合我們的規律,只有第一個不符合,那么我們可以先將第一個加數加到sum,然后再變下一個加數,但是要注意每次加數所對應的分子和分母不一樣,所以我們要在求出每個加數之后,找出下一個加數所對應的分子和分母。設通項表示為a=m/n, 那么下一個加數是n/(m+n),然后下下一個加數就是(m+n)/(m+n+n);再分析我們可以發現當前的分子和分母之和(m+n)是下一次的分母n,當前的分母n是下一次的分子m,注意這里在做數據交換的時候需要中間變量,對應我們的通項a=m/n,理解前面一句話。則程序為: int i;float sum=0, m=1,n=1,t;for(i=1;i<=100;i++){ sum+=m/n;t=m+n;m=n;n=t;} printf(“%f”,sum);
二.累乘:乘數1*乘數2*乘數3*??*乘數n(n個乘數相乘)假設我們用i表示我們的乘數數目,例如:當i=9時,就表示乘數9 模版:int i,sum=1;(注意:如果是分數或者小數sum就是float類型)
for(i=1;i<=n;i++)(注意:循環變量的初值和遞變規律,也有
可能是i--,或者i+=2等等){通項a;(通項:用一個通用的式子表示所有的乘數)sum*=a;} printf(“%d”,sum);(注意:如果是float類型就是%f)
1、求1*2*3??*100的積,則通項a就是i。
分析:因為a就是i的值,所以這里不需要通項這一行了,因此整個大括號中間就只有一句話,所以大括號可以省略。整理之后就是: int i,sum=1;for(i=1;i<=100;i**)sum*=i;printf(“%d”,sum);
2、求2*4*6??*100的和。分析:因為a就是i的值,所以這里不需要通項這一行了,因此整個大括號中間就只有一句話,所以大括號可以省略,再分析,再分析我們發現每個乘數都是偶數,那么i的變化就是i+=2,并且i是從2開始變化,那么在賦值的時候就應該是i=2。整理之后就是: int i,sum=1;for(i=2;i<=100;i+=2)sum*=i;printf(“%d”,sum);
3、求1*3*5??*99的和。
分析:因為a就是i的值,所以這里不需要通項這一行了,因此整個大括號中間就只有一句話,所以大括號可以省略,再分析,再分析我們發現每個乘數都是奇數,那么i的變化就是i+=2。整理之后就是: int i,sum=1;for(i=1;i<=100;i+=2)sum*=i;printf(“%d”,sum);
4、求1*5*9*13*17*??的前100項的積,則通項為j*4,則程序為: 分析:因為乘數的第一項是1,所以賦初值的時候j=1,然后乘數進行變化,變成5乘到sum里面,所以這里要將通項和求積這兩句話互換位置。
int i,sum=1,j=1;for(i=1;i<=100;i**){ sum*=j;j=j*4; } printf(“%d”,sum);
5、求1*4*9*16*??的前100項的積
分析可知:每個乘數就是對應的乘數數目的平方,則通項為i*i,則程序為: int i,sum=1;for(i=1;i<=100;i**)sum*= i*i;printf(“%d”,sum);
6、求1*(1*2)*(1*2*3)*(1*2*3*4)*??的前100項的積。分析可知每一個乘數本身又是一個累乘的式子,進一步觀察可以發現,每個累乘的式子都是乘到這個乘數所在的乘數數目,即第35個乘數就是1*2*3??*35,并且是在前面一個乘數的基礎上乘上這個乘數所在的乘數數目,也就是說第36個乘數就是在前一個乘數的基礎上乘上36,即:1*2*3??*35*36。假設第k個乘數是j,那么第k+1個乘數就可以表示為j*(k+1),然后第k+2個乘數就是j*(k+1)*(k+2)??那么我們的通項就可以表示為a=a*i,則程序為: int i,sum=1, a=0;for(i=1;i<=100;i**){ a*=i;sum*=a;} printf(“%d”,sum);
7、求1*1*2*3*5*8*13*21*??的前100項的積。
分析可知從第三個乘數開始,每一個乘數是其前兩個乘數之和,假設第k個乘數是m,第k+1個乘數是n,然后第k+2個乘數就是m+n,那么我們的通項就可以表示為a=m+n,但是要注意每次乘數所對應的m和n不一樣,所以我們要在求出每個乘數之后,找出其對應的m和n;再分析我們可以發現當前的n是下一次的m,當前的乘數a是下一次的n,假設接著上面的推導,那么第k+3個乘數就是n*(m+n),對應我們的通項a=m*n,理解前面一句話。則程序為: int i,sum=1, m=1,n=1,a;for(i=3;i<=100;i**){ a=m+n;sum*=a;m=n;n=a;} printf(“%d”,sum);
8、求1*1/2*1/3*??*1/100 分析可知每一個乘數就是我們的乘數數目的倒數,則通項a就是1/i,我們說循環變量i一般定義為整型,那么1/i的結果就是整型,這樣的話小數點后面的就會被省略,所以正確的應該寫為a=1.0/i,則程序為:
int i;float sum=1;for(i=1;i<=100;i**){a=1.0/i;sum*=a;} printf(“%f”,sum);
9、求1*1/2*2/3*3/5*5/8*??的前100項的積。
分析可從第三個乘數開始觀察,每一個乘數的分母是其前一個乘數的分子和分母之和,每一個乘數的分子是其前一個乘數的分母。可以將第一個乘數看成1/1,那么第二個乘數也符合我們的規律,只有第一個不符合,那么我們可以先將第一個乘數乘到sum,然后再變下一個乘數,但是要注意每次乘數所對應的分子和分母不一樣,所以我們要在求出每個乘數之后,找出下一個乘數所對應的分子和分母。設通項表示為a=m/n, 那么下一個乘數是n/(m+n),然后下下一個乘數就是(m+n)/(m+n+n);再分析我們可以發現當前的分子和分母之和(m+n)是下一次的分母n,當前的分母n是下一次的分子m,注意這里在做數據交換的時候需要中間變量,對應我們的通項a=m/n,理解前面一句話。則程序為: int i;float sum=1, m=1,n=1,t;for(i=1;i<=100;i**){ sum*=m/n;t=m+n;m=n;n=t;} printf(“%f”,sum);
10、求1+(1*2)+(1*2*3)+(1*2*3*4)+??的前100項的和。
分析可知每一個加數本身是一個累乘的式子,進一步觀察可以發現,每個累乘的式子都是乘到這個乘數所在的乘數數目,即第35個乘數就是1*2*3??*35,并且是在前面一個乘數的基礎上乘上這個乘數所在的乘數數目,也就是說第36個乘數就是在前一個乘數的基礎上乘上36,即:1*2*3??*35*36。假設第k個乘數是j,那么第k+1個乘數就可以表示為j*(k+1),然后第k+2個乘數就是j*(k+1)*(k+2)??那么我們的通項就可以表示為a=a*i,再利用累加的模版,則程序為:
int i,sum=0, a=1;for(i=1;i<=100;i**){ a*=i;sum+=a;} printf(“%d”,sum);
11、求1*(1+2)*(1+2+3)*(1+2+3+4)*??的前100項的積。
分析可知每一個乘數本身又是一個累加的式子,進一步觀察可以發現,每個累加的式子都是加到這個乘數所在的乘數數目,即第35個乘數就是1+2+3??+35,并且是在前面一個乘數的基礎上加上這個乘數所在的乘數數目,也就是說第36個乘數就是在前一個乘數的基礎上加上36,即:1+2+3??+35+36。假設第k個乘數是j,那么第k+1個乘數就可以表示為j+(k+1),然后第k+2個乘數就是j+(k+1)+(k+2)??那么我們的通項就可以表示為a=a+i, 再利用累乘的模版,則程序為:
int i,sum=1, a=0;for(i=1;i<=100;i**){ a+=i;sum*=a;} printf(“%d”,sum);
三.最大值和最小值:數字0,數字1,數字2,??數字n-1(一共n個數字)假設我們用i表示我們的數字所在的位置,并且第一個位置是0,例如:當i=9時,就表示這個數字在第10個位子
模版: int i,max,a[n];(注意:如果是分數或者小數max和a[n]就是float
類型,注意這里定義的時候根據題目所給的具體數字把n換掉,千萬不可以寫a[n]o哦~~~~)
for(i=0;i 了數字,就在定義的時候直接賦值,這個循環就不需要了;如果要求產生給數組賦a到b之間的隨機數,那么就用a[i]= a + rand()%(b-a);這句話代替這句。注意如果是float類型就是%f)max=a[0];for(i=0;i 1、求20個數字的最大值和最小值,要求賦1到100之間的隨機數,并且輸出它們及其下標。 分析:因為這里還要輸出其下標,所以還有定義一個row來存放,并且要對其賦值為0,因為我們給max賦值為a[0],則程序為: int i,max,min,a[20],row1=0,row2=0;for(i=0;i<20;i++)a[i]= 1+rand()%99;max=a[0];min=a[0];for(i=0;i<20;i++){ if(maxa[i])(這里是找出最小值){ min=a[i];row2=i;} } printf(“max =%d, row=%dn min =%d, row=%dn”, max,row1,min,row2); 2、求4*5矩陣的最大值和最小值,要求賦值隨機數,并且輸出它們及其下標。分析:雖然這是一個二維的數組,但是其思路仍然和一維數組的一樣,區別只是這里需要用嵌套循環。要求還要輸出其下標,二維數組的下標是兩個,所以還要定義一個row和一個col來存放,并且要對它們賦值為0,因為我們給max賦值為a[0] [0],則程序為: int i,j,max,min,a[4] [5],row1=0,row2=0,col1=0,col2=0;for(i=0;i<4;i++)for(j=0;j<5;j++)a[i] [j]=rand();max=a[0] [0];min=a[0] [0];for(i=0;i<4;i++)for(j=0;j<5;j++){ if(maxa[i] [j])(這里是找出最小值){ min=a[i] [j];row2=i;col2=j;} } printf(“max =%d, row=%d, col=%d n min =%d, row=%d, col=%d n”, max,row1, col1, min,row2, col2); 3、求4*5矩陣的每一行最大值和最小值,要求賦值隨機數,并且輸出它們及其下標。 分析:雖然這是一個二維的數組,但是要求的是每一行的最大最小值,我們知道二維數組的每一行本身就是一個數組,那么我們就還需要一個控制行數的循環。要求還要輸出其下標,二維數組的下標是兩個,每一行的最大最小值其行號不就是i,所以還要定義一個存放列號的col,并且要對它賦值為0,因為我們給max賦值為每一行的第一個元素,也就是a[i] [0],則程序為: int i,j,max,min,a[4] [5],col1=0,col2=0;for(i=0;i<4;i++)for(j=0;j<5;j++)a[i] [j]=rand();for(i=0;i<4;i++)(這個循環是控制行的,里面的循環體本身就是一個求 一維數組的最大最小值的程序) {max=a[i] [0];min=a[i] [0];for(j=0;j<5;j++){ if(maxa[i] [j])(這里是找出最小值){ min=a[i] [j];col2=j;} } printf(“max =%d, row=%d, col=%d n min =%d, row=%d, col=%d n”,max,i, col1, min,i, col2);} 4、求4*5矩陣的每一列最大值和最小值,要求賦值隨機數,并且輸出它們及其下標。 分析:雖然這是一個二維的數組,但是要求的是每一列的最大最小值,二維數組的每一列可以看成一個數組,那么我們就還需要一個控制列數的循環。要求還要輸出其下標,二維數組的下標是兩個,每一列的最大最小值其列號不就是j,所以還要定義一個存放行號的row,并且要對它賦值為0,因為我們給max賦值為每一列的第一個元素,也就是a[0] [j],則程序為: int i,j,max,min,a[4] [5],row1=0,row2=0;for(i=0;i<4;i++)for(j=0;j<5;j++)a[i] [j]=rand();for(j=0;j<5;j++)(這個循環是控制列的,里面的循環體本身就是一個求 一維數組的最大最小值的程序){max=a[0] [j];min=a[0] [j];for(i=0;i<4;i++){ if(maxa[i] [j])(這里是找出最小值){ min=a[i] [j];row2=i;} } printf(“max =%d, row=%d, col=%d n min =%d, row=%d, col=%d n”,max, row1,j, min, row2,j);} 5、排序(冒泡法)比如說 對于5個數字排序,首先要把5個數字放到一個一維的數組里面去 所以編程的前幾句為:int a[5] for(i=0;i<5;i++)scanf(“%d”,&a*i+); 那接下來就是排序了,為了方便理解就將數組實際化:比如 a[5]里面放著{7,9,0,12,3}那畫圖出來就是 a[5] a[0] a[1] a[2] a[3] a[4] ????????????那我們排序的方法是這樣的采用這樣幾步: 1,用a[0]與后面的(a[1]~a[4]里面的每一個成員比較即是說:a[0]~a[1]比較 a[0]~a[2]比較 a[0]~a[3]比較 a[0]~a[4]比較)當后面的成員只要發現比a[0]小的就與他的位置交換 這部做完之后數組就應 該是這個樣子: a[0] a[1] a[2] a[3] a[4] ???????????2,用a[1]與后面的(a[2]~a[4]里面的每一個成員比較即是說: a[1]~a[2]比較 a[1]~a[3]比較 a[1]~a[4]比較)當后面的成員只要發現比a[1]小的就與他的位置交換 這部做完之后數 組該是這個樣子:這個時候的a1不是我們賦初值時候的a1老就是我們改變后的數組所以這個時候的a1=9哦。 a[0] a[1] a[2] a[3] a[4] ???????????3,用a[2]與后面的(a[3]~a[4]里面的每一個成員比較即是說: a[2]~a[3]比較 a[2]~a[4]比較)當后面的成員只要發現比a[2]小的就與他的位置交換 這部做完之后數組就應 該是這個樣子: a[0] a[1] a[2] a[3] a[4] ???????????4,用a[3]與后面的(a[4]~a[4]里面的每一個成員比較即是說: a[3]~a[4]比較)當后面的成員只要發現比a[2]小的就與他的位置交換 這部做完之后數組就應 該是這個樣子: a[0] a[1] a[2] a[3] a[4] ???????????循環就是 寫成這個樣子的哦: for(i=0;i<4;i++) for(j=i+1;j<5;j++)if(a[i] {c=a[i];a[i]=a[j];a[j]=c;}(這個復合語句表示交換a[i]與a[j]進行交換)你把這個 循環好好的分析一下,當i=0 j可以取(1 2 3 4)那if是不是就是a0跟a1—a4之間的所有進行比較并且交換。其他的以此類推。 最后是不是要對排好序的數組進行輸出: for(i=0;i<5;i++)printf(“%d”,a*i+); 6、排序(選擇法)比如說 對于5個數字排序,首先要把5個數字放到一個一維的數組里面去 所以編程的前幾句為:int a[5] for(i=0;i<5;i++)scanf(“%d”,&a*i+); 那接下來就是排序了,為了方便理解就將數組實際化:比如 a[5]里面放著{7,9,0,12,3}那畫圖出來就是 a[5] a[0] a[1] a[2] a[3] a[4] ????????????那我們排序的方法是這樣的采用這樣幾步: 1,先把a[0]的下標儲存起來,即賦值給k,然后用a[0]與后面的比較 (a[1]~a[4]里面的每一個成員比較即是說:a[0]~a[1]比較 a[0]~a[2]比較 a[0]~a[3]比較 a[0]~a[4]比較)當后面的成員只要發現比a[0]小的就把他的下標賦值給k,最后將a[0]和a[k]的位置交換,這步做完之后數組就應該是這個樣子: a[0] a[1] a[2] a[3] a[4] ???????????2,先把a[1]的下標儲存起來,即賦值給k,然后用a[1]與后面的比較 (a[2]~a[4]里面的每一個成員比較即是說: a[1]~a[2]比較 a[1]~a[3]比較 a[1]~a[4]比較)當后面的成員只要發現比a[1]小的就把他的下標賦值給k,最后將a[1]和a[k]的位置交換 這步做完之后數組就應該是這個樣子: a[0] a[1] a[2] a[3] a[4] ???????????3,先把a[2]的下標儲存起來,即賦值給k,然后用a[2]與后面的比較 (a[3]~a[4]里面的每一個成員比較即是說:a[2]~a[3]比較 a[2]~a[4]比較)當后面的成員只要發現比a[2]小的就把他的下標賦值給k,最后將a[2]和a[k]的位置交換 這步做完之后數組就應該是這個樣子: a[0] a[1] a[2] a[3] a[4] ???????????4,先把a[3]的下標儲存起來,即賦值給k,然后用a[3]與后面的比較(a[4]里面的每一個成員比較即是說: a[3]~a[4]比較)當后面的成員只要發現比a[3]小的就把他的下標賦值給k,最后將a[3]和a[k]的位置交換 這步做完之后數組就應該是這個樣子: a[0] a[1] a[2] a[3] a[4] ???????????循環就是 寫成這個樣子的哦: for(i=0;i<4;i++) {k=i;for(j=i+1;j<5;j++) if(a[i] k=j;if(k!=i) {c=a[i];a[i]=a[j];a[j]=c;} }(這個復合語句表示交換a[i]與a[j]進行交換)把這個循環好好的分析一下,當i=0, j可以取(1 2 3 4)那if是不是就是a0跟a1—a4之間的所有進行比較并且交換。其他的以此類推。 最后是不是要對排好序的數組進行輸出: for(i=0;i<5;i++)printf(“%d”,a*i+); 四.尋找特殊的數字或解應用題:輸出a到b之間的所有的具有某個特點的數字 模版: int n,a,b;(注意:如果是分數或者小數a和b就是float類型) scanf(“%d,%d”,&a,&b);(從鍵盤輸入查找的范圍;如果題目已經給 了范圍,就在循環的時候直接帶值,這句話就不需要了。注意如果是float類型就是%f。注意如果運行程序,在輸入數據驗證的時候注意格式要匹配)for(n=a;n<=b;n++)(如果題目已經給了具體的范圍,那么這里就根 據題目把a和b換掉){if(條件)(注意:這句話是這類題目的核心,有時候也許不是一 句話,這句話放在這的意思是判定是否是特殊數字)printf(“%d”, n);(注意:如果是float類型就是%f)} 1、輸出3到1000之間的所有素數 分析:在做本題之前,先要搞明白什么是素數,它又是如何判定的。補充: 素數 又叫質數,如果一個數只能被1和它本身整除,那么我們就說它是素數。分析:既然一個素數只可以被1和它本身整除,那么當我們判斷一個數n是不是素數的時候,就用這個數去除2到(n-1),一旦我們發現可以整除這個區間的某一個數,那么我們就不再去除別的數了,因為在2到(n-1)這個范圍內,n可以整除其中的某一個數,那么就肯定不是素數。這個過程需要一個循環和停止循環的break來實現。繼續分析,當我們在2到(n-1)這個范圍內找不到n可以整除的數,那么就說明這個數是素數,那么我們就判斷上面的循環時候做完了,如果中間就跳出循環,則說明不是素數,反之,如果做完了,那么就是素數。P判斷能否整除,就是求余看是否為0,則程序如下: int n;(n是要判斷的數,具體根據題意賦值或從鍵盤輸入)for(i=2;i 上面的循環有沒有做完)本題分析:只要用上面的程序替換掉模版的那個if就可以了,注意這里不再需要else了,因為題目只要求輸出素數,輸出語句也只需要一句,則程序如下: int n,i;for(n=3;n<=1000;n++){ for(i=2;i 2、輸出1到100之間的所有同構數 分析:在做本題之前,先要搞明白什么是同構數,它又是如何判定的。補充: 同構數 如果一個數出現在自己的平方數的右邊,那么我們就說它是同構數。分析:既然一個同構數會出現在它自己的平方數的右邊,那么當我們判斷一個數n是不是同構數的時候,先要做的就是求出這個數的平方,然后該怎么判斷是不是出現在右邊呢?我們人有眼睛,可以直接看,但是電腦不長眼睛的,它看不到,它只能分析,那么它怎么分析呢?1到100之間的所有數只有一位或者兩位,那么我們在取平方數右邊的時候,只要取這個平方數的最右邊的一位或者兩位,與我們的數進行比較,看是否一樣,如果一樣就是同構數,反之就不是。怎么取一個數的最右邊一位或者兩位呢?求余!!一個數對10求余就是取它的最右邊一位,也就是個位;如果對100求余就是取它的最右邊兩位,也就是十位和個位。則程序如下: int n;(n是要判斷的數,具體根據題意賦值或從鍵盤輸入)if(n*n%10==n|| n*n %100==n)printf(“%d is a isomorphic number!n”,n);本題分析:直接帶模版,則程序如下: int n;for(n=1;n<=100;n++){ if(n*n%10==n|| n*n %100==n)printf(“%d is a isomorphic number!n”,n);}(這里的大括號實際是可以去掉的,不去掉也沒有關系) 3、輸出1到1000之間的所有回文數 分析:在做本題之前,先要搞明白什么是回文數,它又是如何判定的。補充: 回文數 如果一個數字正讀和倒讀一樣,那么這個數字就是回文數。例如:98789, 這個數字正讀是98789,倒讀也是98789,所以這個數字就是回文數。 分析:既然一個回文數正讀和倒讀一樣,也就是它的最高位和最低位一樣,它的次高位和次低位一樣,那么當我們判斷一個數n是不是回文數的時候,先要確定這個數有幾位,才可以確定誰與誰進行比較,然后確定這個數每一位都是誰。1到1000之間的數,除了1000其余最多三位數,顯然1000不是回文數,先不考慮,怎么確定這個數是幾位呢?如果它的百位是0,那么肯定不是三位數,如果百位和十位都是0,那么肯定是一位數,我們知道一位數肯定都是回文數;對于一個兩位數,只要判斷它的個位和十位是不是一樣就可以了,如果一樣,那么肯定是回文數;對于一個三位數只要判斷他的個位和百位就可以了,如果一樣就是回文數。求一個最多是三位數的每一位,就是將這個數對10求余得到個位;然后這個數除以10,再對10求余得到十位;最后除以100得到百位。則程序如下: int n;(n是要判斷的數,具體根據題意賦值或從鍵盤輸入)if(n>0&&n<10)printf(“%d is a huiwen number!n”,n);else if(n/100==0){if(n/10==n%10)printf(“%d is a huiwen number!n”,n);} else if(n/100==n%10)printf(“%d is a huiwen number!n”,n);本題分析:只要用上面的程序替換掉模版的那個if就可以了,則程序如下: int n;for(n=1;n<=1000;n++){ if(n>0&&n<10)printf(“%d is a huiwen number!n”,n);else if(n/100==0){if(n/10==n%10)printf(“%d is a huiwen number!n”,n);} else if(n/100==n%10)printf(“%d is a huiwen number!n”,n);} 4、輸出1到1000之間的所有完數 分析:在做本題之前,先要搞明白什么是完數,它又是如何判定的。補充: 再做完數之前先講怎么求兩個數的最大公約數和最小公倍數。 分析:假設求a和b兩個數的最大公約數和最小公倍數,并且a>b,如果a0&&n<10)printf(“%d is a wanshu!n”,n);else if(n/100==0){if(n/10==n%10)printf(“%d is a wanshu!n”,n);} else if(n/100==n%10)printf(“%d is a wanshu!n”,n);本題分析:只要用上面的程序替換掉模版的那個if就可以了,則程序如下: int n;for(n=1;n<=1000;n++){ if(n>0&&n<10)printf(“%d is a wanshu!n”,n);else if(n/100==0){if(n/10==n%10)printf(“%d is a wanshu!n”,n);} else if(n/100==n%10)printf(“%d is a wanshu!n”,n);} 5、輸出1到999之間的所有水仙花數 分析:在做本題之前,先要搞明白什么是水仙花數,它又是如何判定的。補充: 水仙花數 如果一個三位數的各個位數字的立方和等于該數字本身,那么這個數就是水仙花數。例如:153,1*1*1+5*5*5+3*3*3=153,所以這個數字就是回文數。分析:既然一個水仙花數的各個位數字的立方和等于該數字本身,那么當我們判斷一個數n是不是水仙花數的時候,先要求出各個位數字,然后求其立方和,判斷是不是和該數本身一樣,如果一樣就是水仙花數,否則就不是。求一個三位數的每一位,就是將這個數對10求余得到個位;然后這個數除以10,再對10求余得到十位;最后除以100得到百位。則程序如下: int n,a,b,c;(n是要判斷的數,具體根據題意賦值或從鍵盤輸入)a=n/100;b=n/10%10;c=n%10;if(a*a*a+b*b*b+c*c*c==n)printf(“%d is the shuixianhua number!n”,n);本題分析:只要用上面的程序替換掉模版的那個if就可以了,則程序如下: int n;for(n=1;n<=1000;n++){ a=n/100;b=n/10%10;c=n%10;if(a*a*a+b*b*b+c*c*c==n)printf(“%d is the shuixianhua number!n”,n);} 6、用一張100的錢換100張零鈔,假設面額有5元,3元,1/2元三種,問有多少種方法? 分析:這是一道解方程組的題,根據我們的小學知識可以列出方程組,其中有三個未知數,所以應該是三層嵌套循環,再分析題目我們知道1/2的張數只能是偶數張,則程序為: int i,j,k,n;for(i=0;i<=20;i++)for(j=0;j<=33;j++)for(k=0;k<=100;k++)if(5*i+3*j+k/2==100&&i+j+k==100&&k%2==0){ printf(“%d,%d,%dn”,i,j,k);n++;} printf(“There are %d changes!n”,n); 7、愛因斯坦階梯問題。設有一階梯,每步跨2階,最后剩1階;每步跨3階,最后剩2階;每步跨5階,最后剩4階;每步跨6階,最后剩5階;每步跨7階,正好到階梯頂。問滿足條件的最少階梯數是多少? 分析:這道題的實質是找滿足上述條件的數,而且要最小的,那么我們就寫一個循環,循環變量從最小的數開始遞增,分析題目我們可知從7開始遞增即可(如果不從7,從1開始也是可以的),一旦滿足上述條件,循環變量就不需要增加了,輸出循環變量即可,所以我們選擇while循環結構,當不滿足上述條件我們就做循環變量的遞增,如果滿足就輸出,則程序為: int n=7;while(!(n%2==1&&n%3==2&&n%5==4&&n%6==5&&n%7==0)){ n++;} printf(“%dn”,n); 8、求一句英文所含有的單詞數。 分析:一句英文里面每個單詞之間都用空格隔開,所以我們只要數空格的個數即可,但是注意最后一個單詞后面是沒有空格的。一句英文肯定要存放在數組中,我們選擇簡單的一維數組。從字符數組中的第一個元素開始查看,先查看第一個元素,如果不是空格,那就證明是第一個單詞,單詞個數加一,然后一直做循環,直到遇到空格,就說明這個單詞結束了,然后再判斷是不是到數組的結尾,如果沒有就繼續查找,直到數組結束為止,則程序如下: #include } 五.圖案:輸出n行的具有規律的字符,組成我們所想要的圖案。模版: int i,j,k;for(i=0;i 具體對待)for(k;;)printf(“%d”,);(注意:如果是char類型就是%c)} 1、輸出下列圖案 * *** ***** printf(“ There are %d words.n”,num);******* ********* ******* ***** *** * 分析:這種圖案一般我們會將其分為兩部分,從最多一行隔開,分為上下兩個部分,先輸出上面的圖案,再輸出下面的。通過分析我們可以發現每行既要輸出空格,又要輸出*,所以循環體里面需要兩個循環,循環體里面的循環變量的控制最好和外層的控制行數的循環變量相關聯。我們用i控制行數,用j控制每行的空格數,用k控制每行的*數,通過觀察我們發現如下規律: i j k 0 4 1 1 3 3 2 2 5 3 1 7 4 0 9 那么,i+j=4,k均為奇數,再分析發現k=2i+1,每行輸完還要輸出換行,則程序如下: int i,j,k;for(i=0;i<5;i++){ for(j=0;j<4-i;j++)printf(“ ”);for(k=0;k<2*i+1;k++)printf(“*”);printf(“n”);} for(i=0;i<4;i++){ for(j=0;j 2、輸出下列圖案 A BBB CCCCC DDDDDDD EEEEEEEEE FFFFFFF GGGGG HHH I 分析:這種圖案一般我們會將其分為兩部分,從最多一行隔開,分為上下兩個部分,先輸出上面的圖案,再輸出下面的。通過分析我們可以發現每行既要輸出空格,又要輸出字母,所以循環體里面需要兩個循環,循環體里面的循環變量的控制最好和外層的控制行數的循環變量相關聯。我們用i控制行數,用j控制每行的空格數,用k控制每行的字母數,通過觀察我們發現如下規律: i j k 0 4 1 1 3 3 2 2 5 3 1 7 4 0 9 那么,i+j=4,k均為奇數,再分析發現k=2i+1。每行的字母相同但是和上下行的不相同,觀察發現字母是按照順序遞增的,那么我們就先把字母存放在一個變量里面,然后在輸出每行所需的字符之后,改變字母。每行輸完還要輸出換行,則程序如下: int i,j,k;char c=’A’;for(i=0;i<5;i++){ for(j=0;j<4-i;j++)printf(“ ”);for(k=0;k<2*i+1;k++)printf(“%c”,c);c++;printf(“n”);} for(i=0;i<4;i++){ for(j=0;j 3、輸出下列圖案 121 12321 1234321 123454321 1234321 12321 121 1 分析:這種圖案一般我們會將其分為兩部分,從最多一行隔開,分為上下兩個部分,先輸出上面的圖案,再輸出下面的。通過分析我們可以發現每行既要輸出空格,又要輸出數字,所以循環體里面需要兩個循環,循環體里面的循環變量的控制最好和外層的控制行數的循環變量相關聯。我們用i控制行數,用j控制每行的空格數,用k控制每行的數字數,每行的數字還不相同,觀察發現數字是按照順序遞增遞減的,那么我們輸出數字的循環又要分為兩個循環,繼續觀察我們發現每次輸出的數字和循環變量k有關,通過觀察我們發現如下規律: i j k 0 4 1 1 3 2 2 2 3 3 1 4 4 0 5 那么,i+j=4,k均為奇數,再分析發現k的遞增從1開始到i+1為止,遞減是從i開始到1為止。每行輸完還要輸出換行,則程序如下: int i,j,k;for(i=0;i<5;i++){ for(j=0;j<4-i;j++)printf(“ ”);for(k=1;k<=i+1;k++)printf(“%d”,k);for(k=i;k>0;k--)printf(“%d”,k);printf(“n”);} for(i=0;i<4;i++){ for(j=0;j0;k--)printf(“%d”,k);printf(“n”);} 4、輸出九九乘法表 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 ?? ?? 分析:如果用i表示行,j表示列,那么每行輸出i個式子,分析發現每個式子可以用j*i表示。每行輸完還要輸出換行,則程序如下: int i,j;for(i=1;i<10;i++){ for(j=1;j<=i;j++)printf(“%d*%d=%dt”,j,i,j*i);printf(“n”);} 5、輸出楊輝三角的前10行 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 7 21 35 35 21 7 1 8 28 56 70 56 28 8 1 9 36 84 126 126 84 36 9 1 分析:如果用i表示行,j表示列,那么每行輸出i個數字,分析發現除了兩頭的數字為1以外,其余的每個數字每個數字等于上一行的左右兩個數字之和,所以用二維數組比較簡單。每行輸完還要輸出換行,則程序如下: int a[10][10],i,j;for(i=0;i<10;i++){ for(j=0;j<=i;j++){ if(i==j||j==0)a[i][j]=1;else a[i][j]=a[i-1][j]+a[i-1][j-1];printf(“%dt”,a[i][j]);} printf(“n”);} 五.字符串操作: 1.函數的原型說明為int chrn(char *s,char c);,其功能是測試c在s中出現的次數,編制該函數并用相應的主調函數對其進行測試。#include