蓝桥杯2013年省赛c/c++A组题4(颠倒的价牌)

题目标题: 颠倒的价牌

小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店。其标价都是4位数字(即千元不等)。小李为了标价清晰、方便,使用了预制的类似数码管的标价签,只要用颜色笔涂数字就可以了。

这种价牌有个特点,对一些数字,倒过来看也是合理的数字。如:1 2 5 6 8 9 0 都可以。这样一来,如果牌子挂倒了,有可能完全变成了另一个价格,比如:1958 倒着挂就是:8561,差了几千元啊!!

当然,多数情况不能倒读,比如,1110 就不能倒过来,因为0不能作为开始数字。

有一天,悲剧终于发生了。某个店员不小心把店里的某两个价格牌给挂倒了。并且这两个价格牌的电视机都卖出去了!

庆幸的是价格出入不大,其中一个价牌赔了2百多,另一个价牌却赚了8百多,综合起来,反而多赚了558元。

请根据这些信息计算:赔钱的那个价牌正确的价格应该是多少?

答案是一个4位的整数,请通过浏览器直接提交该数字。

参考答案: 9088

运行结果

解题C语言代码如下

/***********************************************************************************************
 ***                 蓝桥杯2013年省赛c/c++A组题4(颠倒的价牌)                                  ***
 ***********************************************************************************************
 *                                                                                             *
 *                 Project Name : -----------------                                            *
 *                                                                                             *
 *                    File Name : T4颠倒的价牌.c                                                *
 *                                                                                             *
 *                   Start Date : 2020-08-05                                                   *
 *                                                                                             *
 *                  Last Update : 2020-08-05 [JYH]                                             *
 *                                                                                             *
 *---------------------------------------------------------------------------------------------*
 * Functions:  																				   * 
 *   main -- 主函数,找到颠倒的价牌                            				     			   * 
 *   get_all_case  --  获得所有排列组合情况,并输出结果                                           *
 *   pow1 -- 幂函数                                                                             * 
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void get_all_case(int m, int n, int **a);
int pow1(int m, int n);

/***********************************************************************************************
 * main -- 主函数,颠倒的价牌    	                                                               *
 *                                                                                             *
 * INPUT:   none                                                                               *
 *                                                                                             *
 * OUTPUT:  none								                                               *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   2020-08-05 JYH : Created.                                                                 *
 *=============================================================================================*/
int main()
{
	int m=7, n=4, mm;
	int **a;
	int i,j;
	mm = pow1(m,n);
	a = (int **)malloc(mm * sizeof(int *));
	for (i = 0; i < mm; ++i){
		a[i] = (int *)malloc(n*2 * sizeof(int));
	}//动态申请二维数组 
	get_all_case(m, n, a);
}


/***********************************************************************************************
 * get_all_case -- 获得所有排列组合情况                                                          *
 *                                                                                             * 
 *          每一位都有m种可能,共有n位                                                           *
 *                                                                                             *
 * INPUT:   m                       														   * 
 *          n                                                                                  *
 *          a    -- 所有可能性存放在二维数组a中(包括反转后的数据)                                  *
 *                  其中每一行为一种可能性,行数为可能性个数                                       * 
 *          num  -- 去除一定不符合要求的数据后,数据的个数                                         *
 *                                                                                             * 
 * OUTPUT:	none                                                                               * 
 *                                                                                             *
 * WARNINGS: none                                                                              *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   2020-08-05 JYH : Created.                                                                 *
 *=============================================================================================*/
void get_all_case(int m, int n, int **a)
{
	int i,j,k,l,num;
	int data[7] = {1, 2, 5, 6, 8, 9, 0};
	for(l=0; l<n; l++){  // 第1-4列 
		for(k=0; k<pow1(m,n-1-l); k++){   // 周期 
			for(j=0; j<m; j++){  // 每位有m种可能 
				for(i=0; i<pow1(m,l); i++){  //每种可能连续重复次数 
					a[k*pow1(m,l+1)+j*pow1(m,l)+i][l] = data[j];
				}
			}
		} 
	}
	// 去除一定不符合要求的数据后,数据的个数
	num = 0;
	for(j=0; j<pow1(m,n); j++){
		if(a[j][0]!=0&&a[j][n-1]!=0){
			num++;
		}
	}
	// 筛选数据过程 
	k=0; 
	for(j=0; j<pow1(m,n); j++){
		if(a[j][0]!=0&&a[j][n-1]!=0){
			for(i=0; i<n; i++){
				a[k][i] = a[j][i];
			}
			k++;
		}
	} 
	// 原始数据储存在第0列中 
	// 颠倒后数据情况,储存在第1列中 
	// 计算两次差值,结果存放在第2列中
	// 筛选数据,亏本0行开始(3,4,5列) , 赚钱100行开始(3,4,5列) 
	k = 0;   l = 0;  
	for(i=0; i<num; i++){
		for(j=0; j<n; j++){
			if(a[i][j]==6){
				a[i][2*n-1-j] = 9;
			}
			else if(a[i][j]==9){
				a[i][2*n-1-j] = 6;
			}
			else{
				a[i][2*n-1-j] = a[i][j];
			}
		}
		a[i][0] = 1000*a[i][0] + 100*a[i][1] + 10*a[i][2] + a[i][3];
		a[i][1] = 1000*a[i][4] + 100*a[i][5] + 10*a[i][6] + a[i][7];
		a[i][2] = a[i][1] - a[i][0]; 
		// 再次筛选(-300<差价<-200) (800<差价<900)的数据
		if(a[i][2]>-300&&a[i][2]<-200){
			a[k][3] = a[i][0];
			a[k][4] = a[i][1];
			a[k][5] = a[i][2];
			k++;
		}
		else if(a[i][2]>800&&a[i][2]<900){
			a[l+100][3] = a[i][0];
			a[l+100][4] = a[i][1];
			a[l+100][5] = a[i][2];
			l++;
		}
	}
	for(i=0; i<k; i++){
		for(j=100; j<100+l; j++){
			if((a[i][5]+a[j][5])==558){
				printf("赚钱的价牌价格为:%d\t", a[j][3]);
				printf("赔钱的价牌价格为:%d\n", a[i][3]);
			}
		}
	} 
}

/***********************************************************************************************
 * pow1 -- 幂函数	                                                                           *
 *                                                                                             *
 *    计算幂函数的值,如:pow(10,5)表示10^5                                                      *
 *                                                                                             *
 * INPUT:   m     -- 底数        															   *
 *          n     -- 指数                                                                      *
 *                                                                                             *
 * OUTPUT:  m的n次方(m^n)			 			                                               *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   2020-08-05 JYH : Created.                                                                 *
 *=============================================================================================*/
int pow1(int m, int n)
{
	if(n==0) return 1;
	return m*pow1(m, n-1);
}

posted on 2020-08-07 14:57  last_point  阅读(176)  评论(0编辑  收藏  举报

导航