学习数据结构的第十三天

难受不是一时的,而是一直持续的。现在写题目的检查越来越难了。并且对思维的要求很高,还,难受。

就拿我自以为很使用的一道题来讲吧。

给定一个长度为 n� 的非负整数环形数组 a1,a2,…,an�1,�2,…,��。

由于环形数组首尾相连,因此 an�� 的下一位元素是 a1�1。

有一个指针,指向该数组中的元素。

初始时,该指针指向 a1�1。

接下来执行以下循环操作(由伪代码表示):

while(指针指向的元素不等于 0)
{
    令当前数组中所有大于 0 的元素减 1,并令指针指向下一位元素;
}

请你输出循环操作结束后,该指针指向的元素的下标。

输入格式

第一行包含整数 n�。

第二行包含 n� 个整数 a1,a2,…,an�1,�2,…,��。

输出格式

一个整数,表示指针最终指向的元素的下标。

数据范围

前 66 个测试点满足 2≤n≤102≤�≤10。
所有测试点满足 2≤n≤1052≤�≤105,0≤ai≤1090≤��≤109。

该说不说,这个题目真的EX我只能说。如果直接硬套的话,门都没有。但是,巧妙地运用数组的话,还差点意思。这个题目的关键就在他的样本数据!样本数据很少,这我就联想到了最小值。(tnnd,awcing终于不是只会写一道题了)用最小值来做指针的开刀,这就会快得多。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n,min=0;
    scanf("%d",&n);
    int arr[n+1];
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&arr[i]);
        if(i==1)
        {
            min=arr[1];//找最小值,关键
        }
        else
        {
            if(min>arr[i])
            {
                min=arr[i];
            }
        }
    }

    int q=min%n+1,l=min;//算减去最小值q指向谁,因为样本最多只有10嘛
    while(arr[q]-l>0)
    {
        if(q!=n)
        {
            q++;
        }
        else
        {
            q=1;
        }
        l++;
    }
    printf("%d",q);
}

题意翻译

人们常用的电子表格软件(比如: Excel)采用如下所述的坐标系统:

第一列被标为 A,第二列为 B,以此类推,第 2626 列为 Z。接下来为由两个字母构成的列号: 第 2727 列为 AA,第 2828 列为 AB ⋯⋯ 在标为 ZZ 的列之后则由三个字母构成列号,如此类推。

行号为从 11 开始的整数。

单元格的坐标由列号和行号连接而成。比如,BC23 表示位于第 5555 列 2323 行的单元格。

有时也会采用被称为 RXCY 的坐标系统,其中 �X 与 �Y 为整数,坐标 (�(X,�)Y) 直接描述了对应单元格的位置。比如,R23C55 即为前面所述的单元格。

您的任务是编写一个程序,将所给的单元格坐标转换为另一种坐标系统下面的形式。

输入

第一行一个整数 �n (1(1 ≤≤ �n ≤≤ 105)105) 表示将会输入的坐标的数量。

接下来 �n 行,每行一个坐标。

注意: 每个坐标都是正确的。此外不会出现行号或列号大于 106106 的单元格。

输出 �n 行,每行一个被转换的坐标。

输出

�n 行,每行一个被转换的坐标。

还有没有人九九我,这道题哪里出问题了,真的崩溃了。

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int n;
   char crr[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";//标号数组
   scanf("%d",&n);
   while(n--)
   {
       int i,a=1,b,sum=0,sum2=0,brr[300],m=0,flag=0;
       char arr[300];
       scanf("%s",arr);//输入
       if(arr[0]=='R'&&arr[1]>='0'&&arr[1]<='9')//判断是哪一种
       {
           int i=2;
           while(arr[i]!='\0')
           {
               if(arr[i]='c')
               {
                   flag=1;
               }
               i++;
           }
       }
       i=0;
       if(flag==0)
       {
           while(arr[i]>='A'&&arr[i]<='Z')//换算
           {
               i++;
           }
           b=i-1;
           while(arr[b]!='\0')
           {
               b++;
           }
           while(b>=i-1)
           {
              sum2=sum2+a*(arr[b]-'0');
              a=a*10;
              b--;
           }
           a=1;
           while(i>=0)
           {
               sum=sum+(arr[i-1]-'A'+1)*26*a;//换算
               a=a*10;
               i--;
           }
           a=1;
           printf("R%dC%d",sum,sum2);
       }
       else
       {
           i=i+1;
           while(arr[i]!='C')
           {
              i++;
           }
           int d=i;
           while(i>=1)
           {
               sum=sum+(arr[i]-'0')*a;
               a=a*10;
               i--;
           }
           a=1;
           int f=0;
          for (;sum; sum = sum / 26 - !(sum % 26))//换算26进制
            {
                if (sum % 26)
                    brr[f++] = sum % 26;
                else
                    brr[f++] = 26;
            }
            while(f)
            {
                printf("%c",crr[brr[f--]]);输出
            }
            while(arr[d+1]!='\0')
            {
                printf("%c",arr[d+1]);输出
            }
       }
   }
    return 0;
}

救救孩子。手都冻僵了。。。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值