C 语言基础题:PTA L1-027 出租

下面是新浪微博上曾经很火的一张图:

C 语言基础题:PTA L1-027 出租_第1张图片一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1index[1]=0 对应 arr[0]=8index[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   // 引入标准输入输出库  
#include  // 引入整数类型库  

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");  // 输出数组定义语句的结束符号和分号、换行符  
}

你可能感兴趣的:(c,c语言)