实例1.1 最大子列和问题 (20分)
尺取
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 int n; 6 scanf("%d",&n); 7 int s[100010]; 8 for(int i=1;i<=n;i++) 9 scanf("%d",s+i); 10 int i; 11 int max=0; 12 int ans=0; 13 int sum=0; 14 for(i=1;i<=n;i++) 15 { 16 ans+=s[i]; 17 if(ans<s[i]) 18 ans=s[i]; 19 if(ans>sum) 20 sum=ans; 21 22 } 23 printf("%d\n",sum); 24 }
习题1.8 二分查找 (20分)
注意一下要按题目要求返回
1 Position BinarySearch( List L, ElementType X ) 2 { 3 int p = 0; 4 int s = 1; 5 int e = L->Last; 6 while(s <= e){ 7 int mid = (s + e) / 2; 8 if(L->Data[mid] == X){ 9 p = mid; 10 break; 11 }else if(L->Data[mid] > X){ 12 e = mid-1; 13 }else{ 14 s = mid+1; 15 } 16 } 17 if(p == 0) 18 return NotFound; 19 return p; 20 }
习题2.1 简单计算器 (20分)
纯模拟题
1 #include<stdio.h> 2 int main() 3 { 4 int num1,num2,flag=0; 5 char op='0'; 6 scanf("%d", &num1); 7 while(op!='=') 8 { 9 scanf("%c", &op); 10 if(op=='=') 11 break; 12 scanf("%d", &num2); 13 if(op=='+') 14 num1=num1+num2; 15 else if(op=='-') 16 num1=num1-num2; 17 else if(op=='*') 18 num1=num1*num2; 19 else if(op=='/') 20 { 21 if(num2!=0) 22 num1=num1/num2; 23 else 24 flag=1; 25 } 26 else 27 flag=1; 28 } 29 if(flag==1) 30 printf("ERROR"); 31 else 32 printf("%d\n",num1); 33 return 0; 34 }
习题2.2 数组循环左移 (20分)
纯模拟
1 #include<stdio.h> 2 main() 3 { 4 int n,m; 5 scanf("%d%d",&n,&m); 6 int i=1; 7 int s[102]; 8 m=m%n; 9 if(n==1) 10 { 11 int t; 12 scanf("%d",&t); 13 printf("%d\n",t); 14 } 15 else 16 { 17 if(m==0) 18 { 19 for(i=1;i<=n-1;i++) 20 { 21 int t; 22 scanf("%d",&t); 23 printf("%d ",t); 24 } 25 int t; 26 scanf("%d",&t); 27 printf("%d\n",t); 28 } 29 else { 30 for(i=1;i<=m;i++) 31 scanf("%d",s+i); 32 33 for(i=m+1;i<=n;i++) 34 { 35 int t; 36 scanf("%d",&t); 37 printf("%d ",t); 38 } 39 for(i=1;i<=m-1;i++) 40 printf("%d ",s[i]); 41 if(m>0)printf("%d\n",s[m]); 42 else printf("%d\n",s[m]);}} 43 }
习题2.3 数列求和-加强版 (20分)
简单数学,首先乘出个数再一步步退
#include<stdio.h> #include<string.h> int s[100001]; int main() { int i,j; scanf("%d%d",&i,&j); int temp=0; int t=0; int max=100000; if(j==0) { printf("0"); return 0; } for(t=0;t<j;t++) { s[t]=(i*(j-t)+temp)%10; temp=(i*(j-t)+temp)/10; } if(temp) s[t]=temp; else t--; for(t;t>=0;t--){ printf("%d",s[t]); } }
习题2.8 输出全排列 (20分)
dfs模板题
1 #include<stdio.h> 2 #include<string.h> 3 int s[100001]; 4 int book[1000]; 5 int i; 6 int dfs(int f) 7 { 8 if(f==i+1) 9 { 10 for(int j=1;j<=i;j++) 11 printf("%d",s[j]); 12 printf("\n"); 13 return 0; 14 } 15 for(int j=1;j<=i;j++) 16 { 17 if(book[j]==0) 18 { 19 book[j]=1; 20 s[f]=j; 21 dfs(f+1); 22 book[j]=0; 23 } 24 } 25 } 26 int main() 27 { 28 29 30 scanf("%d",&i); 31 dfs(1); 32 33 34 }