蓝桥杯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) 编辑 收藏 举报