下面是新浪微博上曾经很火的一张图:
一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,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};
程序源码:
#include <stdio.h> // 引入标准输入输出库
#include <stdint.h> // 引入整数类型库
int main(void) // 主函数
{
uint8_t buf[10], buf2[11], flag = 0; // 定义两个数组和一个标志位,buf用于统计数字出现次数,buf2用于记录数字首次出现的位置,flag用于控制输出格式
char c; // 定义字符变量,用于读取输入中的每个字符
int8_t x = 0, i, j; // 定义整数变量,x用于循环控制,i、j用于嵌套循环中的计数
memset(buf, 0, 10); // 将buf数组初始化为0
while (1) // 无限循环,直到遇到非数字字符
{
c = getchar(); // 从标准输入中读取一个字符
if (c >= '0' && c <= '9') // 如果该字符是数字字符(0-9)
{
buf[c - '0']++; // 将该数字对应的计数器加1
buf2[x++] = c - '0'; // 将该数字首次出现的位置记录在buf2数组中,并将x自增1
}
else // 如果该字符不是数字字符
{
break; // 跳出循环
}
}
printf("int[] arr = new int[]{"); // 输出Java代码中的数组定义语句
for (x = 9; x >= 0; x--) // 从大到小遍历buf数组
{
if (buf[x] > 0) // 如果该数字出现过
{
if (flag == 0) // 如果还没有输出过数字
{
printf("%d", x); // 输出该数字
flag = 1; // 将标志位设为1,表示已经输出过数字
}
else // 如果已经输出过数字
{
printf(",%d", x); // 输出该数字和逗号
}
}
}
printf("};\n"); // 输出数组定义语句的结束符号和分号、换行符
flag = 0; // 将标志位重置为0,用于控制输出格式
printf("int[] index = new int[]{"); // 输出Java代码中的数组定义语句
for (x = 0; x < 11; x++) // 遍历buf2数组
{
j = 0; // 定义计数器j,用于记录数字首次出现的位置(从右往左数)
for (i = 9; i >= 0; i--) // 从大到小遍历buf数组
{
if (buf[i] > 0) // 如果该数字出现过
{
if (buf2[x] != i) // 如果buf2中记录的数字与当前遍历到的数字不同
{
j++; // 将计数器j加1
}
else // 如果buf2中记录的数字与当前遍历到的数字相同
{
if (flag == 0) // 如果还没有输出过数字的位置信息
{
printf("%d", j); // 输出该数字的位置信息(从右往左数)
flag = 1; // 将标志位设为1,表示已经输出过位置信息
}
else // 如果已经输出过数字的位置信息
{
printf(",%d", j); // 输出该数字的位置信息和逗号
}
break; // 跳出内层循环,继续遍历下一个数字的位置信息
}
}
}
}
printf("};\n"); // 输出数组定义语句的结束符号和分号、换行符
}