所有代碼都展示main函數里面的代碼
輾轉相除法
int u = 32;int v = 32;//如果v=0,計算結束,u就是最大公約數//v!=0計算u/v的余數,讓u=v v=余數while(v!+0){ int temp = u%v; u = v; v = temp;}printf("%d",u);
從計算機到程序再到算法
計算機的思維和優勢是把所有可能列出來挨個試(枚舉)
用二分法可以進一步簡化運算提高算法效率
程序的執行
解釋:借助一個程序,那個程序能試圖理解你的程序,然后按照你的要求執行
編譯:借助一個程序,那個程序能將你的程序翻譯成機器語言后執行
編譯和解釋的區別與看法
需求:
int price = 0;printf("請輸入金額(元)");scanf("%d",&price);int change = 100 - price;printf("找您%d元。/n",change);
優化
int price = 0;const int AMOUNT = 100;printf("請輸入金額(元)");scanf("%d",&price);int change = AMOUNT - price;printf("找您%d元。/n",change);
const是個修飾符,加在int前面,const修飾變量一經初始化則無法修改,還可以進行再次優化,讓用戶輸入那個變量的值,而不是固定的100
變量定義的一般形式:<類型名稱><變量名稱>;
在數學中a=b和b=a意義完全相同,但是在程序設計中意義完全相反
所有變量在第一次使用時之前應被賦值(初始化)
<類型名稱><變量名稱>=<初始值>;
scanf("%d",&price);
要求scanf這個函數去讀入下一個整數,讀到的結果賦值給price
雙引號里的時格式字符串,%d表示讀取整數
小心price前面的&,在scanf變量前要加&
int hour1,minute1;int hour2,minute2;scanf("%d %d",&hour1,&minute1);scanf("%d %d",&hour2,&minute2);int t1 = hour1*60 + minute1;int t2 = hour2*60 + minute2;int t = t1 + t2;printf("時間差是%d小時%d分",t/60,t%60);//利用t/60抽象出小時,t%60抽象出分鐘
int a,b;scanf("%d %d",&a,&b);//人們利用浮點數表達所有的帶小數點的數,當浮點數和整數放到一起運算的時候,c會將整數轉換為浮點數,然后進行浮點運算double c = (a+b)/2.0;printf("%d和%d的平均值為%lf",a,b,c);
數據類型 | 中文名稱 | 格式字符串 |
---|---|---|
double | 雙精度浮點數 | “%lf” |
float | 單精度浮點數 | “%f” |
int | 整數 | “%d” |
int a = 5;int b = 6;int t = 0;t = a;a = b;b = t;printf("a=%d b=%d",a,b);
+= -= *= /= %= ++ –
這些符號是因為c語言繼承了曾經的機器語言
count ++;count += 1;count = count + 1;
上述三種是一個意思都能完成加一
a++表示加一以前的值
++a表示加一以后的值
但這倆種運算過后,下一行再用a都是加一過后的值
/*if(條件成立){ ...;}*/// ==相等 !=不等 >大于 >=大于或者等于 <小于 <=小于或等于//當兩個值的關系符合關系運算符的預期時,關系運算的結果為1,否則為0printf("%d/n",5==3);printf("%d/n",5>3);printf("%d/n",5<3);//所有的關系運算符的優先級比算術運算的低,但是比賦值運算的高7 >= 3+4;int r = a>0;//判斷是否相等的優先級比其他的低//連續的關系運算是從左到右進行的
//初始化int price = 0;int bill = 0;//讀入數據printf("請輸入金額");scanf("%d",&price);printf("請輸入票面");scanf("%d",&bill);printf("應該找您:%d/n",bill-price);
但是我們上面那個程序無法判斷給夠錢了嘛,即判斷票面夠不夠
我們進行一個邏輯判斷對程序進行優化
//初始化int price = 0;int bill = 0;//讀入數據printf("請輸入金額");scanf("%d",&price);printf("請輸入票面");scanf("%d",&bill);if(bill>=price){ printf("應該找您:%d/n",bill-price);}else{ printf("錢不夠還差:%d/n",price-bill);}
int a,b;printf("請輸入兩個正整數:");scanf("%d %d",&a,&b);int max = 0;if(a>b){ max = a;}else{ max = b;}printf("%d和%d的最大值是%d",a,b,max);
int a,b,c;scanf("%d %d %d",&a,&b,&c);int max = 0;if(a>b){ if(a>c) { max = a; } else { max = c; }}else{ if(b>c) { max = b; } else { max = c; }}printf("最大值是%d",max);
案例二也可以用別的方法解決,如冒泡排序等
有如下分段函數,要求設計一個程序,輸入x輸出y
f(x) = -1 x<0
f(x) = 0 x=0
f(x) = 2x x>0
//只展示if部分if(x<0){ f = -1;}else if(x=0){ f = 0;}else{ f = 2*x;}
編程習慣tips
if語句常見錯誤
若級聯過多,執行效率會非常低,可用switch結構
switch(控制表達式){case 常量:語句;break;case 常量:語句;break;default:語句break;}
控制表達式只能是整數類型的結果
常量表達式可以是常數,也可以是表達式
switch語句可以看作一種基于計算的跳轉,多個值對應一個語句
案例:成績轉換
成績大于等于90為A
成績大于等于80為B
成績大于等于70為C
成績大于等于60為D
成績小于60為E
int grade;scanf("%d",&grade);grade /= 10;//我們只抽象出十位數進行運算,這樣就可以使用switch結構switch(grade){ case 10: case 9: printf("A/N"); break; case 8: printf("B/N"); break; case 7: printf("C/N"); break; case 6: printf("D/N"); break; default: printf("E/N"); break;}
級聯>的時候從高往下判斷
級聯<的時候從下往高判斷
int x;int n = 0;scanf("%d",&x);//這行代碼是保證輸入0的時候輸出位數是1n++;x /= 10;while(x>0){ n++; x /= 10;}printf("%d/n",n);
tips
優化
我們現實中很多情況都需要先執行一次再判斷循環
do-while會先執行一次再判斷循環
int x;int n = 0;scanf("%d",&x);do{ n++; x /= 10;}//這個while后面一定要打分號while(x>0);printf("%d/n",n);
拓展案例:計數循環
int count = 100;while(count>=0){ //這兩行決定第一個輸出和最后一個輸出的數據是什么 count--; printf("%d/n",count);}printf("發射/n");
計算機想一個數,然后讓用戶去猜
猜的時候提醒大了還是小了直到猜中為止
補充知識
程序設計思路
srand(time(0));int number = rand()%100+1;int count = 0;int a = 0;printf("我已經想好了1-100的整數");do{ printf("請輸入這個1-100的整數"); scanf("%d",&a); count++; if(a>number) { printf("大了"); } else { printf("小了"); }}while(a!=number);prinf("用了%d次猜中了數字%d",count,number);
讓用戶輸入一系列正整數,最后輸入-1結束,然后程序計算出這些數字的平均數和數字個數
程序設計思路
int number;int sum = 0;int count = 0;scanf("%d",&number);while(number!=-1){ sum +=number; count++; scanf("%d",&number);}printf("%f/n",1.0*sum/count);
輸入一個正整數(int范圍內的整數),輸出逆序的數
程序設計思路
int x = 0;int sum = 0;int t = 0;scanf("%d",&x);int count = 0;//防止x改變利用一個變量代替x進行操作t = x;//我們先得到x是幾位數,為了防止輸入的是0,我們要先進行一次運算t /= 10;count++;while(t!=0){ t /= 10; count++;}//逆序處理//有幾位數就進行幾次運算for(int i=0;i<count;i++){ //抽象出最后一位,并且把x從左往右少一位 int a = x % 10; x /= 10; //利用j=count-i-1抽象出每次的一位要變到前面去需要×10的幾次方,這種方法也能解決末尾是0的問題因為0*任何數都是0 for(int j=count-i-1;j>0;j--) { a *= 10; } //計算和即可 sum += a;}printf("%d",sum);
案例1:算階乘
int n;scanf("%d",&n);int fact = 1;int i = 1;for(i=1;i<=n;i++){ fact *= i;}printf("%d",fact);
案例2:是否是素數
int x;scanf("%d",x);int i;int isPrime = 1;for(i=2;i<x;i++){ if(x%i == 0) { isPrime = 0; break; } else { continue; }}if(isPrime = 0){ printf("%d不是素數",x);}else{ printf("%d是素數",x);}
關于for循環
tips
如何用1.2.5角湊10元以下的金額
方案1:接力break
int x;int one,two,five;int exit = 0;scanf("%d",&x);for(one=1;one<x+10;one++){ for(two=1;two<x*10/2;two++) { for(five=1;five<x*10/5;five++) { if(one+two*2+five*5==x*10) { printf("%d1角%d2角%d5角",one,two,five); //設置一個變量作為出口條件,創建接力break exit = 1; break; } if(exit == 1) { break; } } if(exit == 1) { break; } }}
方案2:goto
int x;int one,two,five;int exit = 0;scanf("%d",&x);for(one=1;one<x+10;one++){ for(two=1;two<x*10/2;two++) { for(five=1;five<x*10/5;five++) { if(one+two*2+five*5==x*10) { printf("%d1角%d2角%d5角",one,two,five); goto FLAG; } } }}FLAG:return 0;
輸入一個非負整數,正序輸出每一位,每一位中間有空格,最后無空格
程序設計思路
int x;scanf("%d",&x);int mask = 1;while(t>9){ t /= 10; mask *= 10;}do{ int d = x / mask; printf("%d",d); if(mask>9) { printf(" "); } x %= mask; mask /= 10;}while(mask>0);printf("/n");
方法一:設t為2,如果u,v都能被整除則記下t,t++后重復第二步直到等于u和v的最小值,那么曾經記下的最大的t就是goc
int a,b;int min=0;scanf("%d %d",&a,&b);if(a>b){ max = a;}else{ max = b;}int ret = 0;for(int i=0;i
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/122010.html
摘要:是你學習從入門到專家必備的學習路線和優質學習資源。的數學基礎最主要是高等數學線性代數概率論與數理統計三門課程,這三門課程是本科必修的。其作為機器學習的入門和進階資料非常適合。書籍介紹深度學習通常又被稱為花書,深度學習領域最經典的暢銷書。 showImg(https://segmentfault.com/img/remote/1460000019011569); 【導讀】本文由知名開源平...
摘要:最近,來自浙江大學悉尼大學等高校的研究人員,提出一種新穎的全局局部注意和語義保持的文本圖像文本框架來解決這個問題,這種框架稱為。目前,論文已被接收。喬婷婷,浙江大學計算機學院博士研究生,目前在悉尼大學陶大程教授研究小組工作。 GAN又開辟了新疆界。去年英偉達的StyleGAN在生成高質量和視覺逼真的圖像,騙過了無數雙眼睛,隨后一大批假臉、假貓、假房源隨之興起,可見GAN的威力。StyleGA...
摘要:中國的行業的蓬勃發展,蛋糕之大,讓所有行業從業者的收入總體處于行業前列,可比擬的只有金融行業一個不創造財富,只分配財富的行業。每天收到十幾份簡歷,卻招聘不到合適的人。很多小伙伴冷門專業,普通學校,畢業了工作幾年了月薪還是幾千塊,這就是現狀。 ? ? ?? ? ? ?中國的IT行業因為有人口福...
閱讀 788·2021-10-09 09:44
閱讀 691·2019-08-30 13:55
閱讀 3152·2019-08-29 15:07
閱讀 3218·2019-08-29 13:09
閱讀 2412·2019-08-29 11:10
閱讀 1288·2019-08-26 14:05
閱讀 3589·2019-08-26 13:57
閱讀 2205·2019-08-23 16:42