P1函數
- 函數是執行一個特定功能的語句。每個 C 程序都至少有一個函數,即主函數 main() 。
- 你可以自己創建一個函數,讓這個函數執行一個特定的任務。注意:你寫的自定義函數要寫在main函數前面。
- 在 C 語言中,函數由下列幾個元素組成:
- 返回類型:一個函數可以返回一個值。返回的值可以是整型、浮點型、字符型。有些函數不能可以不返回值,在這種情況下,要在函數名前面加void。如
int Sum(){}
,int就是返回類型。 - 函數名稱:這是函數的實際名稱。如
int Sum(int a){}
,Sum就是函數名,根據函數的功能來給函數命名。 - 參數:當函數被調用時,您向參數傳遞一個值,這個值被稱為實際參數。參數由數據類型 變量名組成,如
int Sum(int a){}
,int a
就是實際參數,但他要放在函數名的括號里面。 - 函數主體:就是大括號里面的內容,要執行的語句,它可能完成一個特定的功能。比如
getchar()
就是獲取一個字符,當然你也可以自己寫一個屬於自己的函數。它的名字可以是MyGetchar。
- 返回類型:一個函數可以返回一個值。返回的值可以是整型、浮點型、字符型。有些函數不能可以不返回值,在這種情況下,要在函數名前面加void。如
P2命名規定
- 前面說過C語言的命名有見名之意,及看到這個名字就大概知道這是變量或函數是做什么的。
- 駝峰命名法:駱駝式命名法就是當變量名或函數名是由一個或多個單詞連結在一起,這樣的變量名或函數名看上去就像駱駝峰一樣此起彼伏,故得名。
- 小駝峰命名法:一般命名為變量。第一個單詞以小寫字母開始;從第二個單詞開始以后的每個單詞的首字母都采用大寫字母。例如:strLen(字符串的長度)、numLen(數字的長度)
- 大駝峰命名法:一般命名為函數。例如:MyGetchar(我自己創建的一個獲取字符的函數)、MyGetcharAscii(我自己創建的一個獲取字符ascii的函數)
- 下划線命名:str_len、my_getchar、my_Getchar都是正確的
P3無返回類型的函數
例:用函數輸出英文、中文
- 下面一共有3個函數:主函數
main()
,兩個自己定義函數分別是OpenAirConditioner()
(作用:打開空調)和OpenLights()
(作用:打開燈)。 void OpenAirConditioner()
和void OpenLights()
void表示函數沒有返回值,OpenAirConditioner
和OpenLights
是兩個不同的函數名,他們的功能是不同的。因為他們都沒有返回值,所以函數名前面是void。
#include "stdio.h"
void OpenAirConditioner(){
printf("飛沙 打開了空調\n");
}
void OpenLights(){
printf("MrFlySand 打開了燈\n");
}
void main(){
printf("歡迎\n");
OpenLights();
printf("拜拜\n");
}
- C語言首先會從
main()
函數開始執行,並且自頂向下(自上而下)。下面是main中的三條語句:- main函數中首先會輸出歡迎,就比如main是一個房子,首先進入大門,它會對你說“歡迎”。
- 然后會調用
OpenLights()
這個自定義函數。在房子中有一個開關叫做OpenLights();
,並且把這個開關打開了(調用上面的函數),它就會把燈打開。在房子中還有另一個開關叫做OpenAirConditioner();
,但這個開關並沒有被打開,所以即使有空調也不會開空調。 - 最后輸出拜拜。
P4傳參函數
例:輸出兩個數中較大的那個數
- 在
Max()
函數中有兩個參數 num1 和 num2,這個函數的作用是輸出這兩個數中較大的那個數。 - 下面的代碼和上面的代碼比較可以發現函數的圓括號中都多了一點東西。
- 在函數
main()
中調用了函數Max()
,並且Max(a, b)
中有a、b,他們都是整形int。a會把值給num1,b會把值給num2,這個過程叫做傳參。把東西給別人之后,這個東西(數字:520和1314)就不歸a、b所管,但a、b里面還是有520、1314,只是num1=520,num2=1314
。然后num1、num2拿到東西(520、1314)就可以跑路了,num1、num2不管怎么變化都和a、b無關。 - 在函數
Max(int num1, int num2)
中定義了兩個變量num1、num2。因為a、b都是整型,所以num1、num2也要定義為整型int。 - 在
Max()
函數中我們又定義了一個變量max,這個變量max只屬於Max()
函數。如果要在main函數中輸出max的值就是錯誤的,因為在main函數中max是沒有定義的,只是在Max()
函數中定義。所以在main()中寫printf("%d",max);
是錯誤的。 - 注意函數是由函數名和括號組成,所以Max()是函數,max是整型變量,他們是不同的。
- 看下圖,注意箭頭方向(以后也要注意)。
例:交換兩個數字
#include "stdio.h"
void swap(int x, int y){
printf("第1次看看x、y的值:%d %d\n", x, y);
int temp;
temp = x;
x = y;
y = temp; /* 把 temp 賦值給 y */
printf("第2次看看x、y的值:%d %d\n", x, y);
}
void main(){
int a = 520, b = 1314;
printf("第一次看看a、b的值:%d %d\n", a, b);
swap(a, b);
printf("第二次看看a、b的值:%d %d\n", a, b);
}
- 練習:輸出兩個數中較小的那個數。
例:putchar()
putchar()
是C語言函數庫中的一個函數,它的作用是:輸出一個字符。
#include"stdio.h"
main(){
char c;
scanf("%c",&c);//用輸入獲取一個字符,把字符a給了c
printf("%c",c);//輸出變量c的值
putchar(c);//用函數輸出變量c的值
}
例:MyPutchar()函數
- 你也可以自己寫一個輸出字符的函數,它的函數名可以是MyPutchar。
- 用函數直接輸出字符,所以沒有return,函數名前就要用void。
#include"stdio.h"
void Myputchar(char c){
printf("%c", c);
}
main(){
char c = 'a';
MyPutchar(c);
}
- 練習:寫一個輸出字符ascii的函數,它的函數名可以是MyPutcharAscii()。
#include"stdio.h"
void MyPutcharAscii(char c){
printf("%d",c);
}
main(){
char c = 'a';
MyPutcharAscii(c);
}
P5 有返回值的傳參函數
例:返回兩個數中較大的那個數
- 和上面的代碼比較可以發現
Max()
前面從void改為int,並且Max()函數中多了個return max
。 - return就是返回return后面的值,這個值可以是整型、浮點型、字符型。return 最終返回的是一個數或者字符。
return n
;n
最終必須是一個數。比如:return 3*5;
、return a*b;
、return a>b?a:b;
、return pow(2,5);
都是正確的,只要后面最終的結果為一個數即可,因為它們通過計算后會得到一個結果(整型、浮點型、字符型)。 - 如下變量max是整型,所以要把函數Max()前面的void改為int。注意:有return就沒有void,有void就沒有return.
- 最后
Max(a, b)
這一整塊的值就是max的值,也就是return后面的值。你可以把Max(a, b)
這個值賦值給c,也可以直接輸出。因為它變成了一個型型值,所以輸出要用%d。 - 擴展:有時函數名前沒有申明類型(被省略了),它的默認類型就是int。但最好不要省略。
P6 return
- 在函數中,只要執行到return,在這個函數中return后面的任何語句都不會執行。表示這個函數已經執行完成。
#include"stdio.h"
int Function(int n){
printf("MrFlySand");
return n;
printf("飛沙");
}
main(){
printf("%d\n", Function(520));
}
/*
運行結果:
MrFlySand520
*/
- 練習:返回兩個數中較小的那個數
//以下是四種方法
int FindMin1(int a,int b){
int min;
if(a>b){
min=b;
}else
min=a;
return min;
}
int FindMin2(int a, int b){
if(a>b)
return b;
else
return a;
}
int FindMin3(int a, int b){
if(a>b)
return b;
return a;
}
int FindMin4(int a, int b){
return a>b ? b : a;
}
例:getchar()
- 在C語言中有獲取字符的庫函數getchar(),它的作用是獲取一個字符。
- 注意:輸入的是ab,不是a b,ab中間不能有空格,因為空格也是一個字符,空格的ascii是32。
#include"stdio.h"
main(){
char c;
scanf("%c",&c);//用輸入獲取一個字符,把字符a給了c
printf("%c",c);
c = getchar();//用函數獲取一個字符,把字符b賦值給了c
printf("%c",c);
}
/*
輸入:
ab
輸出:
ab
*/
例:MyGetchar()函數
- 當然你也可以自己寫一個獲取字符的函數,它的函數名可以是MyGetchar。
#include"stdio.h"
char MyGetchar(){
char c;
scanf("%c",&c);
return c;
}
main(){
printf("%c",MyGetchar());
}
- 練習:寫一個獲取字符ascii的函數,它的函數名可以是MyGetcharAscii()。
注意:因為ascii是整數,所以函數名前面是int。
#include"stdio.h"
int MyGetcharAscii(char c){
return c;
}
main(){
char c = 'a';
printf("%d",MyGetcharAscii(c));
}
- 練習:返回一個數的絕對值
int MyAbs(int x){
if(x < 0)
return -x;//如果是負數,則返回它的相反數
return x;
}
void main(){
printf("%d %d\n", MyAbs(520), MyAbs(-1314));
}
- 練習:返回一個數的相反數
int MyAbs(int a){
return -a;
}
- 練習:寫三個函數,輸入日期,分別輸出年份、月份、天數。如:date=20211204,Year(date)返回的值為2021;Month(date)返回的值為12;Day(date)返回的值為4。
/**函數解釋說明:
@param {int} date - 年月日時間,如20211204、20210101
*/
int Year(int date){
return date/10000;
}
int Month(int date){
return date/100%100;
}
int Day(int date){
return date%100;
}
例:年月日
- 輸入年月日,計算這一年過去多少天。
Example 1:
Input: 20210123
Output: 23
Reason:一年中的第1個月過去了23天
Example 2:
Input: 20210220
Output: 51
Reason: 到了2月份。1月份已經過去31天,再加2月份過去的天數。就是這一年過去的天數。31+20=51
Example 3:
Input: 20210310
Output: 69
Reason: 到了3月份。1月份已經過去31天,3月份已經過去28天(不是閏年),再加3月份過去的天數。31+28+10=69
Example 3:
Input: 20200310
Output: 70
Reason: 到了3月份。1月份已經過去31天,3月份已經過去29天(是閏年),再加3月份過去的天數。31+29+10=70
/**
@param {int} date - 年月日時間,如20211204、20210101
*/
int Year(int date){
return date/10000;
}
int Month(int date){
return date/100%100;
}
int Day(int date){
return date%100;
}
int GetDate(int date){
int sumDay,monDay;
int year = Year(date);
int month = Month(date);
int day = Day(date);
switch(month){
case 1:monDay=0;break;
case 2:monDay=31;break;//1月已經過去,共31天
case 3:monDay=59;break;//2月28天,共59天
case 4:monDay=90;break;//3月31天,共90天
case 5:monDay=120;break;
case 6:monDay=151;break;
case 7:monDay=181;break;
case 8:monDay=212;break;
case 9:monDay=243;break;
case 10:monDay=273;break;
case 11:monDay=304;break;
case 12:monDay=334;break;
default:printf("data error");break;
}
sumDay = monDay + day;//總天數 = 月份所得的天數 + 天數
if(year%4==0 && year%100!=0 || year%400==0){//判斷是否為閏年
if(month>2)//如果是2月12日不用加閏年29天,只能過了2月才能有閏年的問題
++sumDay;
}
return sumDay;
}
P7for循環
- C 語言中 for 循環的語法:
for(init; condition; increment){
statement(s);
}
解釋:
- init:init 會首先被執行,且只會執行一次。這一步允許您聲明並初始化任何循環控制變量。您也可以不寫任何語句,只要有一個分號出現即可。
- condition條件:只有當condition成立時才會執行statement;如果不成立,則不會執行statement。
- statement:由任意行代碼組成,是你要執行的步驟。
- increment:在執行完 for 循環主體后,控制流會跳回上面的 increment 語句。該語句允許您更新循環控制變量。該語句可以留空。執行完第4步之后,再跳到第2步判斷(請回到第2條上)。
實例
main(){
int a;
for(a = 10; a < 12; a++){
printf("a的值為: %d\n", a);
}
printf("MrFlySand-飛沙\n");
}
/*
當上面的代碼被編譯和執行時,它會產生下列結果:
a 的值: 10
a 的值: 11
解釋說明:
第1步:定義,定義了一個變量a = 10
第2步:判斷,判斷10 < 12是否成立,成立
第3步:做事情,輸出a的值,a的值為:10
第4步:做事情,使變量a自增,=11
第5步:判斷,判斷11 < 12是否成立,成立
第6步:做事情,輸出a的值,a的值為:11
第7步:做事情,使變量a自增,a=12
第8步:判斷,判斷12 < 12是否成立,不成立,for執行完成。繼續執行下面的代碼。
第9步:輸出MrFlySand-飛沙
*/
例:輸出10 ~ 100中的數,且這些數中不能有5的倍數
- 注意:有些編譯器要求init里面不能有int,所以要像上面的代碼一樣單獨用一行定義。
- 因為10和100都是5的倍數,所以可以從11 ~ 99來判斷
void Function(){
for(int i = 11; i < 100; ++i){
if(i%5 != 0){
printf("%d ", i);
}
}
}
- 可以發現,這樣的數字有很多,不利於閱讀。所以現在要求它每8個數字輸出一行。
- 比如,11 ~ 20之間有8個符合要求的數字;21 ~ 30之間有8個符合要求的數字。它們最后一個數字(20、30)都是10的倍數,所以當i是10的倍數時我們就需要輸出\n。
void Function(){
for(int i = 11; i < 100; ++i){
if(i%5 != 0){
printf("%d ", i);
}
if(i%10 == 0){
printf("\n");
}
}
}
- 當我們要輸出m ~ n中的數字時,我們又需要改變函數里面的東西。所以我們可以傳一個范圍給它。
#include"stdio.h"
void Function(int begin, int end){
for(int i = begin; i <= end; ++i){
if(i%5 != 0){
printf("%d ", i);
}
if(i%10 == 0){
printf("\n");
}
}
}
main(){
Function(1,20);
printf("\n\n");
Function(1000,10000);
}
- 接下來,我們要輸出m ~ n中的數字,且這些數中不能有x的倍數,每10個輸出一行。
- 當我們調用函數
Function(1,20,3)
,發現它輸出的並不是每10個輸出一行。因為i是要判斷是不是3的倍數,即使10不是3的倍數,當碰上第2個if時成立了,所以換行了。
void Function(int begin, int end, int x){
for(int i = begin; i <= end; ++i){
if(i%x != 0){
printf("%d ", i);
}
if(i%10 == 0){
printf("\n");
}
}
}
- 所以我們要計算符合要求的數字有多少個,當符合要求的數字有10個時,則換行。這就要我們再聲明一個變量count,用來計算符合要的數字有多少個。下面是改進的代碼:
void Function(int begin, int end, int x){
int count = 0;//能被x整除的數有0個,所以初始值要為0
for(int i = begin; i <= end; ++i){
if(i%x != 0){
printf("%d ", i);
++count;// 符合要求的數字增1
}
if(count%10 == 0){
printf("\n");
}
}
}
- 接下來,我們要輸出m ~ n中的數字,且這些數中不能有x的倍數,每r個輸出一行。
- 當我們像下面的代碼寫時,可以發現它會多空一行。
void Function(int begin, int end, int x, int row){
int count = 0;
for(int i = begin; i <= end; ++i){
if(i%x != 0){
printf("%d ", i);
++count;// 符合要求的數字增1
}
if(count%row == 0){
printf("\n");
}
}
}
/*
當調用Function(1,20,3,5);時會輸出:
1 2 4 5 7
8 10 11 13 14
16 17 19 20
當i = 14時,count=10,第2個if成立。輸出換行,++i自增
當i = 15時,第一個if不成立,count=10,第2個if成立。輸出換行,++i自增
- 所以只有在count變化后再判斷是否換行才是正確的,因此我們要將第2個if放在
++count
之后。
void Function(int begin, int end, int x, int row){
int count = 0;
for(int i = begin; i <= end; ++i){
if(i%x != 0){
printf("%d ", i);
++count;// 符合要求的數字增1
if((count)%row == 0){
printf("\n",count);
}
}
}
}
- 練習:輸出n以內被7或17整除的數。
例:計算總和
- 計算
1+2+3+4+5+...+10
的總和。 - 定義一個變量sum,把所有的i相加,最后返回sum。
int Fun(){
int sum = 0;
for (int i = 1; i <= 10; ++i){
sum = sum + i;
//輸出看看i和sum的變化,如果不需要可以注釋
printf("i=%d,sum=%d\n", i, sum);
}
return sum;
}
int main(){
printf("\n\n 最終sum=%d", Fun());
}
int EvenSum(int start, int end, int x){
int sum=0;
for(int i=start; i<=end;i++){
if(i%x != 0){
sum=sum+i;
}
}
return sum;
}
- 練習:編寫一個程序 ,求出滿足下列條件的4位數:該數是個完全平方數,且第一 、三位數字之和為10,第二、四位數字之積為12。
#include<stdio.h>
#include<math.h>
int main(){
int i,k;
for(i=1000;i<=9999;i++){
k=sqrt(i);
if(k*k==i && i/1000+i/10%10==10 && (i/100%10)*(i%10)==12)
printf("%d\n",i);
}
}
- 練習:編寫一個程序,求e的值。
\[e≈1+\frac{1}{1!}+\frac{1}{2!}+...+\frac{1}{n!} \]
#include<stdio.h>
int main(){
int i,k=1,n;
float e=1;
scanf("%d",&n);
for(i=1;i<=n;i++){
k=k*i;
e+=1.0/k;
}
printf("%f\n",e);
}
- 練習:編寫一個程序,求滿足如下條件的最大的n:
- 12+22+32 +...+n2≤1 000。
#include<stdio.h>
int main(){
int i,s=0;
for(i=1;s<=1000;i++){
s+=i*i;
}
printf("%d\n",i);
}
- 練習:某人摘下一些桃子,賣掉一半, 又吃了一個;第二天賣掉剩下的一半,又吃了一個。第三天、第四天、第五天都如此,第六天一看,發現只剩下一個桃子了。編寫一個程序,采用迭代法求某人一共摘了多少個桃子。
#include<stdio.h>
int main(){
int i,s=1;
for(i=1;i<6;i++){
++s;
s*=2;
}
printf("%d\n",s);
}
- 練習:輸出1~999中能被5整除,且百位數字是5的所有整數,並計算他們的和。
- 百位上是5,從500~599都是百位為5。
- 能被5整除的數有:500、505、510、515...末尾都是0或5,所以可以把步長設為5
P8 while循環
- 格式:
while(條件){語句}
,當條件成立時,執行大括號里面的語句。執行完大括號里面的語句后,再跳到條件那里,然后判斷是否成立,成立則執行大括號里面的內容;當條件不成立時,不執行大括號里面的語句。
#include "stdio.h"
int main(){
int i = 1;
while(i <= 5){
printf("MrFlySand-%d\n", i);
i++;// 注意:要使i的值變大,否則i一直為1。且`1<=5`一直成立就一直會循環下去。
}
printf("飛沙");// 執行完while后輸出 飛沙
}
- while括號里面的數字:當括號里面是0時,表示不成立;其它的數字表示成立。
- 下面是兩個函數,函數的效果都是相同的。注意要使i的值變小。
void Fun1(){
int i = 3;
while(i){
printf("%d ", i--);
}
}
void Fun2(){
int i = 3;
while(i--){
printf("%d ", i);
}
}
/*
運算結果:
3 2 1
*/
幾個常用的封裝函數
例:返回一個數有幾位數
- 先判斷這個數是正數還是負數。如果這個數是負數,則讓它變成正數。如果一個數是0,就代表它沒有一位數 。
- 任何一個數最少有一位。然后用這個數縮小,使它的結果除10。
- 每次除10后,數字的長度加1。當number=0時跳出循環。
int GetNumLen(int number){
if(number < 0)
number *= -1;
else if(number == 0)
return 0;
int len = 1;
while(number /= 10) ++len;
return len;
}
例:獲取數字各個數字的和
int GetNumSum(int number){
if(number < 0)
number *= -1;
else if(number == 0)
return 0;
int numSum = number%10;
while(number /= 10) numSum += number%10;
return numSum;
}
例:獲取數字各個數字的積
int GetNumProduct (int number){
if(number < 0) number *= -1;
int product = number % 10;
while(number /= 10)
product *= number % 10;
return product;
}
例:猜數
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int min,max;
srand(time(0));
int randNum = rand()%1000;
int count = 1;// 用於計算輸入數字的次數
int myNum;
printf("我以經想好了一個數,請猜猜這個數字:\n");
scanf("%d",&myNum);
while (myNum != randNum){
if (myNum > randNum){
printf("你猜的數大了,請再輸入一個數:\n");
} else if(myNum < randNum){
printf("你猜的數小了,請再輸入一個數:\n");
}
scanf("%d",&myNum);
++count;//輸入一個數,次數加1
}
printf("太好了,你用了%d次猜對了答案\n",count);
return 0;
}
/*
printf("請輸入一個最小值:");
scanf("%d",&min);
printf("\b請輸入一個最大值:");
scanf("%d",&max);
printf("請猜這個%d到%d之間的數:\n",min,max);
*/
break和countiue的區別
#include "stdio.h"
int main(){
for(int a = 0; a < 7; a++){
if(a%2==0){
if(a==2){
printf("continue1\n");
continue;
printf("continue2\n");
}
printf("能被2整除的數有:%d\n",a);
}
printf("(%d)",a);
}
printf("\n\n");
for(int b = 0; b < 5; b++){
if(b%2==0){
if(b==2){
printf("break1\n");
break;
printf("break2\n");
}
printf("能被2整除的數有:%d\n",b);
}
printf("(%d)",b);
}
}
/*
運行結果:
能被2整除的數有:0
(0)(1)continue1
(3)能被2整除的數有:4
(4)(5)能被2整除的數有:6
(6)
能被2整除的數有:0
(0)(1)break1
*/
- 代碼分為2部分,上面部分是continue,下面部分是break。
- 由上面代碼可以發現,無論是continue還是break,下面的輸出語句都不會運行。
- break跳出當前/終止循環,continue跳出當前語句
- 練習:求下面式子的值。$$1-\frac{1}{2}+\frac{1}{3}-\frac{1}{4}+...-\frac{1}{99}+\frac{1}{100}$$
#include"stdio.h"
main(){
int n;
scanf("%d",&n);
float i;
double sum=0;
int f=1;
for(i=1;i<=n;i++){
sum+=f/i;
f*=-1;
}
printf("%.2f",sum);
}
- 練習:編寫一個程序求sum=1+(1+2)+(1+2+3)+(1+2+3+4)的值。
#include"stdio.h"
main(){
int i, j, max, sum = 0;
scanf("%d", &max);
for(i = 1; i <= max; i++){
for(j = 1; j <= i; j++){
sum = sum + j;
}
}
printf("sum = %d", sum);
}
- 練習:編寫一個程序,用戶輸入一個正整數,把它的名位數字前后顛倒一下,並輸出。
#include"stdio.h"
int main (){
int num,s=0;
printf("please input a number:");
scanf("%d",&num);
while(num>0){
s=s*10+num%10;
num=num/10;
}
printf("%d", s);
}
- 練習:編寫一個程序,求出200~ 300的數,且滿足條件:它們3個數字之積為42,3個數字之和為12。
#include"stdio.h"
main(){
int num = 200, endNum = 300, g, s, b;
//scanf("%d%d", &num, &endNum);
while(num <= endNum ){
// 取出各個位數
g = num % 10;
s = num / 10 % 10;
b = num / 100;
if(g*s*b == 42 && g+s+b==12){
printf("%d ", num);
}
num++;
}
}
- 練習:設N是一個4位數,它的9倍恰好是其反序數(例如:1089 * 9的反序數是9801) ,求N的值。
#include <stdio.h>
int main(void) {
int i, a, b, c, d ,s;
for(i = 1000; i < 10000; i++){
a = i % 10;
b = i / 10 %10;
c = i / 100 %10;
d = i / 1000 %10;
s = a*1000 + b*100 + c*10 + d;
if(9*i == s) printf("%d", i);
}
}
- 練習:有這樣一個3位數,該3位數等於其每位數字的階乘之和,即abc=a!+b!+c!。(例如:145=1! +4!+5!)
- 練習:編寫程序求出滿足下列條件的4位數:該數是個完全平方數;千位、十位數字之和為10,百位、個位數字之積為12。
- 練習:已知abc+cba=1333,其中a、b、c均為一位數,編寫一個程序求出a、b、c分別代表什么數字。
#include"stdio.h"
int main(void) {
int num1, num2;
int a, b, c;
for(num1 = 100; num1 < 1000; num1++){
a = num1/100;
b = num1/10%10;
c = num1%10;
num2 = c*100 + b*10 + a;
if(num1 + num2 == 1333){
printf("%d ", num1);
}
}
return 0;
}
#include <stdio.h>
int main(void) {
int m, n;
scanf("%d%d", &m, &n);
while(m <= n){
int m1 = m, product = 1, sum = 0;
while(m1){
product *= m1%10;
sum += m1%10;
m1 /= 10;
}
if(product > sum) printf("%d ", m);
m++;
}
}
- 練習:請用do--while循環計算m~n之間所有奇數與偶數之和。
- 練習:用do---while循環來實現統計從鍵盤輸人任意一行字符的個數。
- 練習:下面程序的功能是:輸出100 以內能被3整除且個位數為6的所有整數。
- 練習:編程序計算1!+2! +3! +...+20!
- 練習:有一分數序列:2/1, 3/2, 5/3, 8/5, 13/8,21/13, .求出這個數列的前10項
- 練習:任意輸入10個整數,請求出正數的個數及正數的平均值。
- 練習:編寫程序,輸出100以內能被7整除的數。
- 練習:輸入3 4(都是3組成的數字,且有4個數字),例如求s=3+33+333+3333。
- 練習:求和s=1! +3! +5!。運行結果:127
- 練習:打印500以內的“水仙花數”。“水仙花數”是一個三位數,其各位數立方和等於該數本身。運行結果:153 370 371407
- 練習:判斷m是否為素數。
- 算法:讓m被2到sqrt(m)除,如果m能被2至sqrt(m)之中任何一個整數整除,那么說明m不是素數,否則是素數。
- 例如:判斷17是否為素數,只需使2 ~ 4(sqrt(17)≈4)之間的毎一個整數去除。因為如果m能被2 ~ m-1之間的任意整數整除,如果這個數大於根號m ,那么這個數必定對應的還有一個比根號m小的因子(以16為例,2、8是它的因子,8大於4,而2小於4)。
#include"stdio.h"
int main (){
int num,s=0,count=0;
scanf("%d",&num);
while(num!=0){
if(num>0){
if((++count)>10) break;
s+=num;
}
scanf("%d",&num);
}
printf("%d",s);
}
- 練習:使用for語句實現統計輸人的一行字符串中的字符個數。
- 練習:打印出乘法九九表。
- 練習:求s=1+3+5+7+9+...,其和大於等於500的最大項。
- 練習:計算100以內能被3整除且個位不為7的數的和。程序運行結果:s=1512。
- [分析]變量s的初始值為0,i的初始值為1,先執行循環體中的if語句,此時條件
(i%3==0&&i%10!=7)
為假,則執行i=i+1,i的值為2,計算while后表達式的值2<=100為真,繼續執行循環體,如果if語句條件為真,則s=s+i,再執行i=i+1,然后計算while后表達式i<= 100的值,若為真繼續執行循環體,為假則退出循環體,從而繼續執行輸出s的值。在C語言中,表達式i%3==0&&i%10!=7
表示能被3整除且個位不為7的數。
- 練習:求s=a+aa+aaa+aaaa+a.....a(n個a)的值,其中a為一個數字,要求a以及所加數字個數n由鍵盤輸入。(例如:輸入3 5,s=3+33+333+3333+33333)
- 練習:斐波那契數列的前幾項是1,1,2,3,5,8,13,21,要求輸出該數的100項,每行輸出10個。
- 練習:求s=1+3+5+7+9+...,其和小於等於500的最大項。
- 練習:$$s=1+\frac{1}{3}+\frac{1}{5}+...+\frac{1}{2n-1}$$
- 練習:$$\frac{π}{4}=1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\frac{1}{9}-\frac{1}{11}+...-\frac{1}{2n-1}$$
- 練習:$$s=1+\frac{2}{1!}-\frac{4}{3!}+\frac{6}{5!}-\frac{8}{7!}+\frac{10}{9!}-...+\frac{2n}{(2n-1)!}$$
- 練習:計算前n項和。$$s=\frac{2}{1}+\frac{3}{2}+\frac{5}{3}+\frac{8}{5}+\frac{13}{8}$$
- 一個整數的“反置數”指的是把該整數的每一位 數字的順序顛倒過來所得到的另一個整數。如果一個整數的末尾是以0結尾,那么在它的反置數當中,這些0就被省略掉了。比如說,1245的反置數是 5421,而1200的反置數是21。請編寫一個程序,輸入兩個整數,然后計算這兩個整數的反置數之和sum,然后再把sum的反置數打印出來。要求:由 於在本題中需要多次去計算一個整數的反置數,因此必須把這部分代碼抽象為一個函數的形式。
輸入
輸入只有一行,包括兩個整數,中間用空格隔開。
輸出
輸出只有一行,即相應的結果。
樣例輸入
435 754
樣例輸出
199