下面是新浪微博上曾经很火的一张图:
一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,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};
思路:
数组a存下电话号码的每一位,0到9开布尔数组b,打印第一行,要点是如何控制 " , " 的打印,我是用flag标记第一个 “ { ” ,之后打印逗号,然后开数组c储存下来,第二行双层for循环,第一层找数组a的每一位,第二层找数组c的位置,同样注意逗号的打印。
数组尽量开大点,电话号码有十一位就最好开到十六甚至更大。
AC代码:
#include<stdio.h>
int main()
{
char t[16];
gets(t);
int tt=0,m=0;
int a[16];
while(m<=10)
{
a[tt++]=t[m]-'0';
// printf("##%d\n",a[tt-1]);//测试用
m++;
}
int n=11;
int b[16]={0};
for(int i=0;i<=10;i++)
{
b[a[i]]=1;
}
int flag=0;
printf("int[] arr = new int[]");//打印第一行
int c[16];
int cnt=0;
for(int i=9;i>=0;i--)
{
if(b[i])
{
c[cnt++]=i;
if(!flag)//用flag控制逗号
{
printf("{");
flag=1;
}
else
printf(",");
printf("%d",i);
}
}
cnt--;
flag=0;
printf("};\nint[] index = new int[]");//打印第二行
for(int i=0;i<=10;i++)
{
for(int j=0;j<=cnt;j++)
{
if(a[i]==c[j])
{
if(!flag)
{
printf("{");
flag=1;
}
else
printf(",");
printf("%d",j);
break;
}
}
}
printf("};\n");
return 0;
}