1 有t組數(shù)據(jù)/要測試t次
一個循環(huán)搞定
第一種,for循環(huán)
?
#includeint main(){ int t; scanf("%d",&t); int i; for(i=1;i<=t;i++) printf("%d ",i);//這行不用在意 return 0; }
?
第二種,while循環(huán)(可以省一個i)
?
#includeint main(){ int t; scanf("%d",&t); while(t--) printf("%d ",t);//這行不用在意 return 0;}
?
2 輸入一串字符,回車終止
循環(huán)括號里寫輸入語句
?
#includeint main(){ char ch; while(scanf("%c",&ch),ch!=' ') printf("%c",ch);//逐個操作,可以這樣寫,加入要字符串操作,則需要用數(shù)組 return 0;}
?
3 輸入幾組數(shù),回車分割,用EOF停止
以下是一個字符由小到大排序的問題,題目不重要,主要看輸入方式
?
#includeint main(){ char a,b,c,temp; while(scanf("%c%c%c",&a,&b,&c)!=EOF){ getchar();//前面的scanf()在讀取輸入時會在緩沖區(qū)中留下一個字符' ',(輸入完后按回車導(dǎo)致),這個getchar()用于清除緩存區(qū)這個‘ ’,否則下次輸入會把‘ ’存進(jìn)第一次個字符 if(a>b){ temp=a; a=b; b=temp; } if(b>c){ temp=b; b=c; c=temp; } if(a>b){ temp=a; a=b; b=temp; } printf("%c %c %c ",a,b,c); } return 0;}
?
4 輸入一系列操作指令,讀入over結(jié)束。
相關(guān)指令格式:
find 329 1
copy 2 1 4
add 10 1999
rfind oq 3
insert abc 1 3
reset szuuniversity 2
copy 2 1 5
over
利用了scanf(“%s”,&string);遇到空格就停止接受的特點(diǎn),先把指令前綴收進(jìn)來,再寫一個循環(huán)語句,遇到over就break。
?
char order[100][100];for (i = 0;; i++){ scanf("%s", order[i]); if (strncmp(order[i], "copy", 4) == 0) { } else if (strncmp(order[i], "add", 3) == 0) { } else if (strncmp(order[i], "find", 4) == 0) { } else if (strncmp(order[i], "rfind", 5) == 0) { } else if (strncmp(order[i], "insert", 6) == 0) { } else if (strncmp(order[i], "reset", 5) == 0) { } else if (strncmp(order[i], "over", 4) == 0) break;}
?
5 輸入一些數(shù),讀入-1結(jié)束。
?
int a[50],i = 0; while(scanf("%d", &a[i++]),a[i-1]!=-1);
?
6 輸出一個數(shù),右對齊,空位補(bǔ)零。
?
printf("%04d ", b[i]);//輸出4位數(shù),不夠4位在左邊補(bǔ)零/*輸出結(jié)果實(shí)例:0000000200042000*/
?
?素?cái)?shù)
主要有幾種情況:
1.判斷一個數(shù)是否為素?cái)?shù);
2.給定一個區(qū)間,找到區(qū)間中的所有素?cái)?shù)
3.找素?cái)?shù)并對其求和
4.……
1.1判斷素?cái)?shù)
主要有兩種寫法,在不同場合可能各有優(yōu)劣。
第一種,利用標(biāo)志量記錄判斷素?cái)?shù)。(一般運(yùn)用于分別判斷幾個數(shù)是否同時為素?cái)?shù)之類情況)
?
#includeint main(){ int a,i; scanf("%d",&a);//讀取待判斷數(shù) int su=0;//聲明一個標(biāo)志量,用它來判斷以下循環(huán)是否執(zhí)行完畢 for(i=2;i ?
第二種,利用循環(huán)控制變量的終值判斷循環(huán)是否走完,進(jìn)而判斷素?cái)?shù)。(此方法更加簡潔,更加巧妙,而且不用考慮1不是素?cái)?shù)的情況)
?
#includeint main(){ int a,i; scanf("%d",&a);//讀取待判斷數(shù) for(i=2;i ?
1.2&1.3 找素?cái)?shù)與求和
找素?cái)?shù)無非就是在上一個判斷素?cái)?shù)的基礎(chǔ)之上再加入一個循環(huán)語句,達(dá)到將區(qū)間內(nèi)所有數(shù)遍歷的效果,然后中間再插入一個變量求和即可。(甚至還可以計(jì)算素?cái)?shù)個數(shù))
?
#includeint main(){ int n,m,sum=0; scanf("%d%d",&n,&m);讀入一個區(qū)間 int j; for(j=n;j<=m;j++) { int k; for(k=2;k ?
2 公因數(shù)和公倍數(shù)
主要有幾種情況:
1.找兩個數(shù)的最大公因數(shù)和最小公倍數(shù);
2.求兩個數(shù)之間的所有公因數(shù);
3.題目不直接問求公因數(shù)和公倍數(shù),但需要用到;
4.……2.1求最大公因數(shù)和最小公倍數(shù)
求最大公因數(shù)利用輾轉(zhuǎn)相除法,求最小公倍數(shù)就是把兩數(shù)相乘然后除以最大公因數(shù)。
?
#includeint main(){ int x,y; scanf("%d%d",&x,&y);//讀入兩個數(shù) int a; a = x*y;//提前求乘積,由于后續(xù)輾轉(zhuǎn)相除會改變x和y的值 int temp;//指定臨時變量,用于兩數(shù)交換 while(x%y!=0)//輾轉(zhuǎn)相除 { temp = x; x = y; y = temp%y; } printf("最大公因數(shù)為%d 最小公倍數(shù)為%d ",y,a/y); return 0; } ?
2.2 求所有公因數(shù)
?
#includeint main(){ int x,y; scanf("%d%d",&x,&y);//讀入一個區(qū)間 int j; for(j=1;j ?
3 金字塔
金字塔是常見的循環(huán)問題,本質(zhì)就是雙重循環(huán),一重循環(huán)控制空格輸出,一重循環(huán)控制字符輸出:
1.輸入行數(shù)n,輸出n行金字塔
2.輸入行數(shù)和字符
3.……3.1一般金字塔
?
#includeint main(){ int n; char ch; scanf("%d %c",&n,&ch);//輸入層數(shù)和組成金字塔的字符 int j;//循環(huán)控制變量 for(j=1;j<=n;j++)//循環(huán)n層 { int blank,sym;//指定空格,字符 for(blank=j;blank ?
3.2 菱形
菱形就是在金字塔的基礎(chǔ)上,增加一個判斷指令,讓金字塔對稱打印出來。
?
#includeint main(){ int line; scanf("%d",&line);//輸入菱形的行數(shù) int i; for(i=1;i<=line;i++)//循環(huán)控制,逐層處理 { int n;//引入中間量n,如果行數(shù)在一半以前,正常打印三角形;行數(shù)過半,則等于關(guān)于中間線對稱的那行 if(i<=(line+1)/2) n = i; else n = (line+1)-i; int k; for(k=1;k<=(line+1)/2-n;k++) { printf(" "); } for(k=1;k<=n*2-1;k++) { printf("*"); } printf(" "); } return 0; } ?
4 倒序和分解一個數(shù)的所有位
分享一個任意位數(shù)數(shù)字倒序的算法
倒序有些時候十分重要,比如說判斷一個數(shù)是否對稱,只需要把它倒序,然后比較是否相等即可。?
#includeint main(){ int n,temp,m=0;//定義中間量temp,輸出值m,m要初始化 scanf("%d",&n);//讀入一個任意數(shù) temp = n;//避免n值被改變,如果n值不影響后續(xù)操作,這一步也不需要 while(temp) { m *= 10;//m升一位 m += temp%10;//temp給出最后一位加到m上 temp /= 10;//temp抹去最后一位 } printf("%d",m); return 0;} ?
我們可以用上述算法分解一個數(shù)的所有位,逆序存在一個數(shù)組中
?
#includeint main(){ int a,temp; scanf("%d",&a);//輸入一個數(shù)a temp = a;//用變量保存a,以防后續(xù)有用 int arr[100],i=0; while(temp) { arr[i++] = temp%10; temp /= 10; } arr[i] = 10;//用10作為結(jié)束,可以是別的數(shù),此處只是為了方便取了10; for(i=0;arr[i]!=10;i++) printf("%d ",arr[i]);//結(jié)果是從低位到高位存的 return 0;} ?
5 算數(shù)字位數(shù)
這是一個簡單的循環(huán),但是因?yàn)楹艹S茫蕴嵋幌?/p>
?
#includeint main(){ int a; scanf("%d",&a);//讀入一個非零數(shù) int temp,n=0;//定義中間量以免a值被改變,初始化位數(shù)n temp = a; while(temp) { temp /= 10;//除掉最后一位 n++;//位數(shù)加一 } printf("%d有%d位",a,n); return 0; } ?
6 三個數(shù)大小排序
?
#includeint main(){ int a,b,c; scanf("%d%d%d",&a,&b,&c);//讀入三個數(shù)a,b,c int temp; //定義臨時變量,用于交換 if(c>b)//由于要從大到小輸出,所以從后面開始比較,逐步把大的換到前面來 { temp = b; b = c; c = temp; } if(b>a) { temp = a; a = b; b = temp; } if(b %d>%d",a,b,c); return 0;} ?
7 二進(jìn)制轉(zhuǎn)十進(jìn)制
?
#includeint main(){ char ch; int a=0; while(ch=getchar(),ch!=' ')//利用字符一位一位讀入二進(jìn)制數(shù) a=a*2+(ch-'0');//將十轉(zhuǎn)二的算法反過來做 printf("%d ",a); return 0;} ?
8 自定義字符串轉(zhuǎn)整數(shù)函數(shù)(10進(jìn)制)
?
int myatoi(char s[]){ int i=0,num=0; while(s[i]) num = num*10+(s[i++]-'0'); return num; }?
9 自定義整數(shù)轉(zhuǎn)字符串函數(shù)(10進(jìn)制)
?
char *myitoa(int num,char s[]){ int i=0,j=0; char t[100000]; while(num) { t[i++] = num%10+'0'; num /= 10; } t[i] = '?';//t中的數(shù)字此時是反序的 i = i-1; while(i>=0)//t中數(shù)字倒著裝進(jìn)s中 s[j++] = t[i--]; s[j] = '?'; return s;}?
10 查找字符串子串函數(shù)
?
int find(char s[], char n[])//在字符串N中從左開始找尋S字符串,返回其第一次出現(xiàn)的第一個字符串的下標(biāo),若沒有找到,返回字符串N的長度。{ int i, j = 0; for (i = 0; i < strlen(n) - strlen(s);) { for ( j = 0; j < strlen(s); j++) { if (n[i]==s[j]) i++; else break; } if (j == strlen(s))//如果子串遍歷完了 return (i - j);//返回下標(biāo) else i = i - j + 1; } return strlen(n);}?
11 如果題目中有非常多的字符串比對要求,可以用二維數(shù)組先裝著需要比對的項(xiàng),然后在用循環(huán)語句遍歷,用標(biāo)志量判斷
以手機(jī)號前三位是否合法的比對為例
?
char b[][20]={"133","153","180","181","189","130","131","132","155","156","134","135","136","137","138","182","183","184",'?'}; int i,j,flag; for(i=0;i<18;i++) { if(a[0]==b[i][0]&&a[1]==b[i][1]&&a[2]==b[i][2]) flag=1; }?
12 分解質(zhì)因數(shù)
?
#includeint main(){ int a,temp; scanf("%d",&a);//輸入一個數(shù)a temp = a;//用變量保存a,以防后續(xù)有用 int arr[100]={0},i,j=0; for(i=2;i*i<=temp;i++)//相當(dāng)于做短除法,從2開始試,然后是3,然后是5,其中4這些非素?cái)?shù)已經(jīng)被前面的素?cái)?shù)算過了,因此不需要判斷i是否為素?cái)?shù)了 { if(temp%i==0) { while(temp%i==0) { temp /= i; arr[j++] = i; } } } for(i=0;arr[i]!=0;i++)//我用零來判斷是否結(jié)束了 printf("%d ",arr[i]);//結(jié)果是升序排列的 return 0;} ?
13 找到所有因數(shù),并計(jì)數(shù)
?
#includeint main(){ int a,temp; scanf("%d",&a);//輸入一個數(shù)a temp = a;//用變量保存a,以防后續(xù)有用 int arra[100]={0},ppa=0; int arrb[100],ppb=0; int i,cnt=0;//用于計(jì)數(shù) for(i=1;i*i<=temp;i++) { if(temp%i==0)//找到因數(shù)i存入arra中 { arra[ppa++] = i; cnt++; if(i*i!=temp)//找到i對應(yīng)的另一個因數(shù),存進(jìn)arrb組中 { arrb[ppb++] = temp/i; cnt++; } } } for(i=ppb-1;i>=0;i--)//把兩列因數(shù)拼起來,為了保證升序,arrb列要倒著存進(jìn)arra中 arra[ppa++] = arrb[i]; printf("該數(shù)的因子個數(shù)為%d ",cnt); for(i=0;arra[i]!=0;i++)//我用零來判斷是否結(jié)束了 printf("%d ",arra[i]);//結(jié)果是升序排列的 return 0;} ?
14 強(qiáng)制轉(zhuǎn)換在計(jì)算平均數(shù)中的運(yùn)用
?
#includeint main(){ int arr[105]; int n; scanf("%d", &n); int i,sum = 0; for(i= 0; i < n; i++) { scanf("%d", &arr[i]); sum += arr[i]; } // 記得強(qiáng)制轉(zhuǎn)換,避免整除問題 double ave = (double)sum / n; printf("average = %.3f ", ave); return 0;} ?
15 字符串加密問題
給定?個僅含?寫的字符串,要求對每個字?循環(huán)位移k位后得到結(jié)果
通常做法有?,?是?if else語句分段處理 ‘a(chǎn)’ 到 ‘z’-k 的部分和 ‘z’-k+1到 ‘z’ 的部分,?是??推公式?
#include//第一種方法int main(){ char str[105]; int k; scanf("%s%d", str, &k);//接受一個字符串,接受單個字符向后移動k位的加密指令 int i; for(i = 0; str[i]; i++) { if(str[i] <= 'z' - k) str[i] += k; else str[i] -= (26 - k); } puts(str); return 0; } ?
?
int main()//第二種{ char str[105]; int k; scanf("%s%d", str, &k); int i; for(i = 0; str[i]; i++) str[i] = ((str[i] - 'a') + k) % 26 + 'a';//這是公式 puts(str); return 0;}?
16 選擇排序
選擇排序的關(guān)鍵就是,先假設(shè)最小量的下標(biāo)是第一個數(shù),然后不斷移動這個下標(biāo)遍歷所有,找到最小數(shù)所對應(yīng)的下標(biāo)后,再用互換語句把數(shù)組中的兩數(shù)互換
?
#includeint main(){ int t; scanf("%d", &t); while (t--) { int n, a[20]; scanf("%d", &n); int i,j; for ( i = 0; i < n; i++) scanf("%d", &a[i]); int min; for (i = 0; i < n-1; i++) { min = i;//先假定當(dāng)前下標(biāo)為最小數(shù)的下標(biāo) for ( j = i+1; j < n; j++) if (a[min] > a[j]) min = j;//找到最小數(shù)的下標(biāo),賦給min if (min != i)//將找到的下標(biāo)對應(yīng)的數(shù)與當(dāng)前數(shù)互換 { int temp; temp = a[i]; a[i] = a[min]; a[min] = temp; } for (j = 0; j < n; j++)//這個是輸出排序過程的 if (j != n - 1) printf("%d ", a[j]); else printf("%d ", a[j]); } } return 0;} ?
17 冒泡排序
題目描述
輸入n個數(shù)字,使用冒泡排序?qū)ζ溥M(jìn)行升序排序。
輸入
測試次數(shù)T
每組測試數(shù)據(jù)格式為:數(shù)字個數(shù)n,后跟n個數(shù)字。假設(shè)n<20。
輸出
對每組測試數(shù)據(jù),輸出冒泡排序的每趟排序結(jié)果
樣例輸入
2
5 10 4 43 1 2
10 20 123 12 2 434 54 2 45 23 -10
樣例輸出
4 10 1 2 43
4 1 2 10 43
1 2 4 10 43
1 2 4 10 43
20 12 2 123 54 2 45 23 -10 434
12 2 20 54 2 45 23 -10 123 434
2 12 20 2 45 23 -10 54 123 434
2 12 2 20 23 -10 45 54 123 434
2 2 12 20 -10 23 45 54 123 434
2 2 12 -10 20 23 45 54 123 434
2 2 -10 12 20 23 45 54 123 434
2 -10 2 12 20 23 45 54 123 434
-10 2 2 12 20 23 45 54 123 434
?
#includeint main(){ int t; scanf("%d", &t); while (t--) { int n,a[20]; scanf("%d", &n); int i,j; for (i = 0; i < n; i++) scanf("%d", &a[i]); int t;//臨時量,用于交換 for (i = 0; i < n-1; i++)//一共需要遍歷排n-1輪 { for (j = 1; j < n-i; j++)//每輪需要比較n-i次 { if (a[j-1]>a[j]) { t = a[j - 1]; a[j - 1] = a[j]; a[j] = t; } } for (j = 0; j < n; j++)//把每次的交換過程輸出 { printf("%d", a[j]); if (j!=n-1) printf(" "); } printf(" "); } } return 0;} ?
18 位運(yùn)算符使用,打印字符
打印一個“太”字
?
#includeint main(){ int big[8] = { 0x8,0x8,0x8,0x7f,0x8,0x14,0x2a,0x41 };//int的長度為32位,通過在相應(yīng)位置賦值1,確定字符位置,用十六進(jìn)制數(shù)賦值會方便很多 unsigned int t;//unsigned可以把符號位用上,同時確保右移的過程中左邊補(bǔ)零而不是1,這樣可以變相看做是只有一個1從左向右移動 int i, j; for ( i = 0; i < 8; i++) { t = 0x80000000;//把t的1放在最右邊;如果想要把打印出來的字符進(jìn)行左平移,可以刪去一定數(shù)量的0,刪去一個零,向左移動4位 for ( j = 0; j < 32; j++) { if ((t & big[i]) != 0)//與運(yùn)算,是big[i]的二進(jìn)制32位和t二進(jìn)制32位的逐項(xiàng)比較,若均為一出現(xiàn)1,否則為0,最后在把所得二進(jìn)制數(shù)轉(zhuǎn)十進(jìn)制數(shù)返回 putchar('*'); else putchar(' '); t >>= 1;//移動t的1 } printf(" "); } return 0;} ?
19 數(shù)塔
在講述DP(動態(tài)規(guī)劃)算法的時候,一個經(jīng)典的例子就是數(shù)塔問題,它是這樣描述的:
有如下所示的數(shù)塔,要求從頂層走到底層,若每一步只能走到相鄰的結(jié)點(diǎn),則經(jīng)過的結(jié)點(diǎn)的數(shù)字之和最大是多少?
假設(shè)用二維數(shù)組存儲數(shù)塔。
寫函數(shù)int GetMaxSum(int num[][N],int n) ,計(jì)算含n行數(shù)據(jù)的數(shù)塔num的從頂層走到底層的最大數(shù)字之和。N為宏定義,值為100。
并根據(jù)樣例編寫主函數(shù)。
輸入
輸入數(shù)據(jù)首先包括一個整數(shù)C,表示測試實(shí)例的個數(shù),每個測試實(shí)例的第一行是一個整數(shù)N(1 <= N <= 100),表示數(shù)塔的高度,接下來用N行數(shù)字表示數(shù)塔,其中第i行有個i個整數(shù),且所有的整數(shù)均在區(qū)間[0,99]內(nèi)。
輸出
對于每個測試實(shí)例,輸出可能得到的最大和,每個實(shí)例的輸出占一行。
?樣例輸入
1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
樣例輸出
30
?
#include#define N 100 int max(int a, int b){ if (a > b) return a; else return b;} int GetMaxSum(int num[][N], int n){ int i, j; for ( i = n-2; i >=0; i--)//從倒數(shù)第二行最后一項(xiàng)開始 for ( j = i; j >=0; j--) num[i][j] += max(0, max(num[i + 1][j], num[i + 1][j + 1])); return num[0][0];} int main(){ int t; scanf("%d", &t); while (t--) { int n; scanf("%d", &n); int a[100][N]; int i, j; for (i = 0; i < n; i++) for (j = 0; j < i + 1; j++) scanf("%d", &a[i][j]); printf("%d ",GetMaxSum(a,n)); } return 0;} ?
20 遞歸實(shí)現(xiàn)逆序輸出
題目描述
利用遞歸函數(shù)調(diào)用方式,將所輸入的任意個字符,以相反順序打印出來。輸入
字符串長度和該字符串輸出
逆序輸出樣例輸入
5
12345
樣例輸出
54321?
#includevoid change(char a[],int n){ if(n==-1) return; printf("%c", a[n--]); change(a, n);} int main(){ int n; scanf("%d ", &n); char a[100]; int i; for (i = 0; i < n; i++) scanf("%c", &a[i]); change(a,n-1); return 0;} ?
21 上車人數(shù)(遞歸)
題目描述
公共汽車從始發(fā)站(稱為第1站)開出,在始發(fā)站上車的人數(shù)為a,然后到達(dá)第2站,在第2站有人上、下車,但上、下車的人數(shù)相同,因此在第2站開出時(即在到達(dá)第3站之前)車上的人數(shù)保持為a人。從第3站起(包括第3站)上、下車的人數(shù)有一定的規(guī)律:上車的人數(shù)都是前兩站上車人數(shù)之和,而下車人數(shù)等于上一站上車人數(shù),一直到終點(diǎn)站的前一站(第n-1站),都滿足此規(guī)律。現(xiàn)給出的條件是:共有n個車站,始發(fā)站上車的人數(shù)為a,最后一站下車的人數(shù)是m(全部下車)。試問從C站開出時車上的人數(shù)是多少?
提示:定義函數(shù)int OnBus(int n)為第n站的上車人數(shù)。
輸入
只有一行,四個整數(shù)a,n,m和x
輸出
x站開出時車上的人數(shù)
樣例輸入
5 7 32 4
樣例輸出
13
?
#include//共有n個車站,始發(fā)站上車的人數(shù)為a,最后一站下車的人數(shù)是m(全部下車)。試問從x站開出時車上的人數(shù)是多少?int OnBus(int a,int n,int y)//第一站上車a人,第n站,第二站上車y人;這個函數(shù)算的是凈上車量,也就是車上人的增長量 { if (n == 1) return a; else if (n == 2) return 0; else if (n == 3) return a; else if (n == 4) return y; else if (n >= 5) return (OnBus(a, n - 1, y) + OnBus(a, n - 2, y));} int main(){ int a, n, m, x,y; scanf("%d%d%d%d", &a, &n, &m, &x); int i, j, sum;//這道題最神奇的就是沒有把y告訴你,需要先把y找到,才能進(jìn)行接下來的計(jì)算 for ( y = 1;; y++)//開始找y { sum = 0; for (i = 1;i < n;i++) sum += OnBus(a, i, y); if (sum == m) //如果滿足條件,y就是第二站上車人數(shù); break; } sum = 0; for (i = 1;i <= x;i++) sum += OnBus(a, i, y); //求出第x站車上的人數(shù) printf("%d ", sum); return 0;} ?
22 最長公共子串
題目描述
用函數(shù)實(shí)現(xiàn)以下功能:參數(shù)傳入兩個字符串,找出這兩個字符串的最長公共子串并返回。
例:abcbdab與bdbcbdde的最長公共子串為bcbd。
假設(shè)字符串最大長度為100,且最長公共子串只有一個。
編寫主函數(shù)測試上述函數(shù),在主函數(shù)中接受字符串的輸入和最長子串的輸出。
輸入
2個字符串
輸出
最長公共子串
樣例輸入
What is local bus?
There are some local buses.
樣例輸出
local bus
?
#include#include void compare(char a[],char b[],char c[]){ int len_a,len_b; len_a = strlen(a); len_b = strlen(b); int i,j,matrix[len_a+1][len_b+1],max=0; for(i=0;i ? ? ? 審核編輯:彭靜
評論
查看更多