0.展示PTA总分

1.本章学习总结

1.1 学习内容总结

  • 数组中查找数据:

    1. 数组的数据存放在下标不同的数组中,所以可将下标设为变量,输入确定的下标来寻找数;
    2. 学习过指针后,我们还可以用地址的加减来确定特定的数;
  • 数组中如何插入数据

for j=k;j>n;j-- do//从尾部开始
   a[j]=a[j-1];//将数组右移
end for
a[k-1]=temp;//插入数
  • 数组中如何删除数据:确定删去的数,从该数开始,被赋予下一个数的值,这样要删的的数就被覆盖了;

  • 数组中目前学到排序方法:

    1. 选择排序法:首先找出最大值或最小值,与开头或结尾的数调换,再找出次最值数,再次调换,直到剩下一个数;
    2. 冒泡排序法:从数组开头开始,每一个数与下一个数比较,若大于下一个数,调换位置,这样循环,叨叨一组有序数列;
  • 数组做枚举用法:找重复数的题目中,以数组作为存放不同数的容器,当输入的数与数组的某个下标相同,开数组加一,计算数的出现次数;

1.2 本章学习体会

  • 数组目前给我的感觉是一个工具,有一定的难度,尤其是字符数组,很多东西都没太搞懂,感觉不只在预习的时候要多翻书,平常有空时也要把书多翻几下,查漏补缺。
  • 代码总量:793行

2.PTA实验作业

2.1 7-5 找鞍点

2.1.1 伪代码

定义数组a
输入行列数n
for i=0;i<n;i++ do
  for  j=0;j<n;j++ do
        输入每个值
   end for
end for
for i=0;i<n;i++ do
   point1=a[i][0];
   for(j=0;j<n;j++ do
    比较每个值,找出最大值,记录下标
   end for
   for k0;k<n;k++ do
       在确定的列中找到最小值,记录下标
   end for
比较下标,确定是否为同一个数

2.1.2 代码截图

2.1.3 造测试数据

输入数据 输出数据 说明
1 7 4 1 4 8 3 6 1 6 1 2 0 7 8 9 2 1 正常数据
1 0 0 极小值

2.1.4 PTA提交列表及说明


Q1 编译错误:运用了多个循环后,{}被搞乱了,不知道哪个对应哪个,最后一一找对应,发现了错误;
Q2 部分正确:代码中没有考虑到相同值的出现,最后出现错误,其实加一个=就好了。

2.2 二维数组每列排序

2.1.1 伪代码

定义数组a[4][5]
for j=0;j<k;j++ do
   for k=1;k<=3;k++ do
      for i=0;i<3;i++ do
          运用选择排序法,将每一列排列好
      end for
   end for
end for

2.1.2 代码截图

2.1.3 造测试数据

输入数据 输出数据 说明
1 7 4 1 4 8 3 6 1 6 1 2 0 7 8 9 1 1 7 4 3 4 6 8 1 1 2 6 0 7 8 9 正常数据

2.1.4 PTA提交列表及说明


Q1:运行超时:两次运行超时都是因为==打成了=,这是我打代码是的老毛病了,经常因此百思不得其解,其实只是自己犯二;
Q2:格式错误:没有审清楚题目,所以第一个数前按照习惯没有空格。

2.3 调查电视节目受欢迎程度

2.3.1 伪代码

静态定义数组a
输入个数n
for i=0;i<n:i++ do
 输入每次投票
end for
for i=1;i<=8;i++ do
  输出要求
end for 

2.3.2 代码截图

2.3.3 造测试数据

输入数据 输出数据 说明
11042865468 112456899910 正常数据
111111........... 崩溃 越界

2.3.4 PTA提交列表及说明

Q1:部分错误:段错误,没看清题目,全局变量小于最大数,数组越界

3.阅读代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 20
#define MAX 3628810
 
char s[3][N],op;
int n[3][N],len[3];
int num;
struct cha
{
   char c;
   int n;
}a[N];
bool OK;
 
void init(char *tmp)
{
   bool used[2*N];
   memset(n,0,sizeof(n));
   memset(s,0,sizeof(s));
   memset(a,0,sizeof(a));
   memset(used,0,sizeof(used));
   num=0;
   int i,j,k;
   for(i=0,j=0; i<3; i++)
   {
      len[i]=j;
      for(k=0;;j++,k++)
      {
         if(tmp[j]=='+' || tmp[j]=='-' || tmp[j]=='=' || tmp[j]=='\0')
            break;
         s[i][k]=tmp[j];
         if(tmp[j]>='0' && tmp[j]<='9') n[i][k]=tmp[j]-'0';
         else
         {
            n[i][k]=tmp[j]-'A'+26;
            if(!used[tmp[j]-'A'])
            {
               used[tmp[j]-'A']=true;
               a[num++].c=tmp[j];
            }
         }
      }
      s[i][k]='\0';
      if(i==0) op=tmp[j];
      len[i]=j-len[i];
      j++;
   }
}
 
int tran(int i)
{
   int ans=0;
   for(int k=0; k<len[i]; k++)
      ans=ans*10+n[i][k];
   return ans;
}
 
void solve(int *per)
{
   sort(per,per+num); //全排列前记得排序
   do //对per枚举全排列
   {
      for(int i=0; i<num; i++) a[i].n=per[i];
 
      for(int i=0; i<3; i++)
         for(int j=0; j<len[i]; j++)
            if(s[i][j]>='A' && s[i][j]<='Z')
               for(int k=0; k<num; k++)
                  if(s[i][j] == a[k].c)
                     n[i][j]=a[k].n;
 
      int ss[3];
      for(int i=0; i<3; i++)
         ss[i]=tran(i);
      if(op=='+' && ss[0]+ss[1]==ss[2]) {OK=true; break;}
      if(op=='-' && ss[0]-ss[1]==ss[2]) {OK=true; break;}
 
   }
   while(next_permutation(per,per+num));
}
 
int cmp(struct cha p ,struct cha q)
{
   return p.c < q.c;
}
 
void BF()
{
   int per[20];
   OK=false;
   sort(a,a+num,cmp);
   for(int state=0; state<1024; state++)
   {
      int cc=0;
      for(int k=0; k<10; k++) if(state&(1<<k)) per[cc++]=k;
      if(cc==num)
         solve(per);
      if(OK) break;
   }
   for(int i=0; i<num; i++) printf("%c %d\n",a[i].c,a[i].n);
}
 
int main()
{
   char tmp[3*N];
   while(scanf("%s",tmp)!=EOF)
   {
      init(tmp);
      BF();
   }
   return 0;
}

本题希望得到一个另类的计算器,用数字与字母进行加减法

posted on 2019-11-17 22:51  飞白2020  阅读(272)  评论(1编辑  收藏  举报