2013年填空

2013年省赛A组C++

A、高斯日记 日期计数

大数学家高斯他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210,那个整数就是日期,它表示那一天是高斯出生后的第几天。高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。高斯获得博土学位的那天日记上标着:8113,请你算出高斯获得博士学位的年月日。
提交答案的格式是:yyyy-nn-dd,例如:1980-03-21
1799-07-16:去掉零头从新年年初开始算

bool isrun(int x){ //是否闰年
    if (x%400==0) return true;
    if (x%100 && x%4==0) return true;
    return false;
}
int main(){
    int year=1778,month=1,in=8113-31-30-31-31-30-31-30-31;//从1778年算
    int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    //哪一年
    while (1){
        if (isrun(year)&&in>365) in-=366;
        else if (!isrun(year)&&in>=365) in-=365;
        else break;
        year+=1;
    }
    //哪一月
    if (isrun(year)) m[4]=29;
    while (1){
        if (in>=m[month]) in-=m[month++];
        else break;
    }
    cout<<year<<"-0"<<month<<"-"<<in-1;
    return 0;
}

B、排他平方数 去重数字判断

小明正看着 203879 这个数字发呆。
203879*203879=41566646641仔细观察,203879是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。具有这样特点的6位数还有一个,请你找出它!再归纳一下筛选要求:
1.6位正整数
2,每个数位上的数字不同
3,其平方数的每个数位不含原数字的任何组成数位
答案是一个6位的正整数。
639172:利用map遵守规则写判断函数即可

typedef long long ll;
map<ll,ll> have;
//自身不重复,且记录数字
bool nodefeat(ll x){
    have.clear();
    while (x){
        if (have.find(x%10)==have.end()) have[x%10]=1;
        else return false;
        x/=10;
    }
    return true;
}
//其平方不含其任何数字
bool judge(ll x){
    while (x){
        if (have.find(x%10)==have.end()) x/=10;
        else return false;
    }
    return true;
}
int main(){
    ll i;
    for (i=203880;i<=999999;i++){
        if (nodefeat(i)){//自身不重复
            if (judge(i*i)) break;//找到了
        }
    }
    cout<<i;
    return 0;
}

C、振兴中华 递归计数

小明参加了学校运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字。
在这里插入图片描述
比赛时,先站在左上角的写着“从”字的格子里。可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结来。
要求跳过的路线刚好构成“从我做起振兴中华”这句话。
请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
35:自己做的深搜,其实用递归求有多少条路径就可以TAT

深搜写法:
int cnt=0,maze[5][6]={{0,0,0,0,0,0},{0,1,2,3,4,5},{0,2,3,4,5,6},{0,3,4,5,6,7},{0,4,5,6,7,8}},visit[5][6];
void dfs(int x,int y){
    if (x==4 && y==5) cnt+=1;
    if (x>4||x<1||y>5||y<1) return;//不合法
    //下
    visit[x+1][y]=1;
    dfs(x+1,y);
    visit[x+1][y]=0;
    //右
    visit[x][y+1]=1;0
    dfs(x,y+1);
    visit[x][y+1]=0;
}
int main(){
    //迷宫初始化
    int i,j;
    for (i=1;i<5;i++){
        for (j=1;j<6;j++) visit[i][j]=0;
    }

    //深搜
    visit[1][1]=1;
    dfs(1,1);
    cout<<cnt;
    return 0;
}
递归写法:
int f(int x,int y){
    if (x==4 && y==5) return 1;//终点
    if (x>4||x<1||y>5||y<1) return 0;//不合法
    return f(x+1,y)+f(x,y+1);//往下或往右
}
int main(){
    cout<<f(1,1);
    return 0;
}

D、颠倒的价格 按规则转换数字,存储、判断并输出

小明的样品电视专卖店其标价都是4位数字(即千元不等)。
这种价牌特点是:1 2 5 6 8 9 0倒过来看也是合理的数字。比如:1958例着挂就是:8561,差了几千元啊!当然,多数情况不能倒读,比如1110 就不能倒过来,因为0不能作为开始数字。
有一天,悲剧终于发生了。某个店员不小心把店里的某两个价格牌给挂倒了。并且这两个价格牌的电视机都卖出去了!庆幸的是价格出入不大,其中一个价牌赔了2百多,另一个价房却睡了8百多,综合起来,反而多睡了558元。
请根据这些信息计算:赔钱的那个价牌正确的价格应该是多少?
答案是一个4位的整数:9088

struct node{int prime,gap;};
int c1=0,c2=0;
int change[10]={0,1,2,-1,-1,5,9,-1,8,6};
node up[1000],down[1000];
//四位可倒挂的合理数
int judge(int x){
    int res=0;
    while (x){
        if (change[x%10]!=-1){//可倒挂
            res = res*10+change[x%10];
        }
        else return 0;
        x/=10;
    }
    if (res<1000) return 0; //以0开头
    return res;
}
int main(){
    int out=0;
    for (int i=1000;i<10000;i++){
        int r=judge(i);
        if (r){//可倒挂
            if (r-i>800 && r-i<900) up[c1++]={i,r-i};//赚800+
            else if (i-r>200 && i-r<300) down[c2++]={i,i-r};//亏200+
        }

    }
    //赚八百多的和亏两百多的合起来看是不是558
    for (int i=0;i<c1;i++){
        for (int j=0;j<c2;j++){
            if (up[i].gap-down[j].gap==558){
                out=down[j].prime; //赔钱那个的正确价格
                break;
            }
        }
        if (out!=0) break;
    }
    cout<<out;
    return 0;
}

E、是代码填空题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值