PTA题目集

实例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 } 

猜你喜欢

转载自www.cnblogs.com/johnfllora/p/12337757.html