前言
有点难,博主做了好长时间才做出来,测试点过了,但是还是有点懵蹬,20分的题目,大家看一下吧先
L1-027 出租
下面是新浪微博上曾经很火的一张图:
一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index
数组就是arr
数组的下标,index[0]=2
对应 arr[2]=1
,index[1]=0
对应 arr[0]=8
,index[2]=3
对应 arr[3]=0
,以此类推…… 很容易得到电话号码是18013820100。
本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的。
输入格式:
输入在一行中给出一个由11位数字组成的手机号码。
输出格式:
为输入的号码生成代码的前两行,其中arr
中的数字必须按递减顺序给出。
输入样例:
18013820100
输出样例:
int[] arr = new int[]{8,3,2,1,0};
int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};
OK,以上就是全部的题目,看到题目瞬间就懵逼了,这道题,哇哦,真的,发明这个天才的人肯定是道题。
这道题说的是什么呢?一共有三个部分,分一个电话号码和两个数组,一个数组是存放的电话号码中出现过的数字,并且这些数字要从大到小排列,然后第二个数组中,存放电话号码位数的“密码”,这个密码按顺序从第一个数组中输出得到电话号码的相应位置出现的数字。
这些就是题目要做的东西了,下面看看代码
#代码1(测试点3未通过
#include <stdio.h>
#include <string.h>
int main()
{
char tel[11];
scanf("%s",&tel);
char num[10] = {0};
int count = 0,j = -1;
int i = 0;
for(i = 0;i < 11;i++)
{
if(num[tel[i] - '0'] == 0)
{
num[tel[i] - '0'] = 1;
count++;
}
}
char num1[count];
printf("int[] arr = new int[]{");
for(i = 9;i >= 0;i--)
{
if(num[i] == 1){num1[++j] = i;printf("%d",i);}
if(i) printf(",");
}
printf("};\n");
printf("int[] index = new int[]{");
for(i = 0; i < 11;i++)
{
for(j = 0; j < count;j++)
{
if(tel[i] - '0' == num1[j])printf("%d",j);
}
if(i < 10)printf(",");
}
printf("};");
}
代码2(全部通过
#include <stdio.h>
#include <string.h>
int main()
{
char tel[11];//号码
scanf("%s",&tel);//输入号码
char num[10] = {0};//数字
int count = 0,j = -1;
int i = 0;
for(i = 0;i < 11;i++)//计算出现过的数字
{
if(num[tel[i] - '0'] == 0)
{
num[tel[i] - '0'] = 1;
count++;
}
}
char num1[count];
printf("int[] arr = new int[]{");
for(i = 9;i >= 0;i--)//输出第一个数组
{
if(num[i] == 1){num1[++j] = i;printf("%d",i);if(j<count-1) printf(",");}
}
printf("};\n");
printf("int[] index = new int[]{");
for(i = 0; i < 11;i++)//输出第二个数组
{
for(j = 0; j < count;j++)
{
if(tel[i] - '0' == num1[j]){printf("%d",j);if(i<10)printf(",");}
}
}
printf("};");
}
以上所有代码均为自己编写,本人水平有限,如果有哪里出错或者有更好的解法可以与我私信或在评论区里进行讨论