ACM 蓝桥杯 小题训练1

Problem Description

曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。
 还有人称今后的某个世纪末的12月31日,如果是星期一则会....
 有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!!
 于是,“谣言制造商”又修改为星期日......
 1999年的12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即xx99年)的12月31日正好是星期天(即星期日)?
请回答该年份(只写这个4位整数,不要写12月31等多余信息)


Input


Output

输出一个4位整数

#include <iostream>
using namespace std;
int main()
{  
    int days=0;
   
    int e_days;
 for(int i=2000;;i++)
 {  
 
     
      e_days=365;
     if((i%4==0&&i%100!=0)||i%400==0)
      e_days=366;
    
  days=days+e_days;
      if(days%7==2&&(i-99)%100==0)
       {
        cout<<i;
        break;
    }
 
 }
 return 0;
}




小明和他的表弟一起去看电影,有人问他们的年龄。小明说:今年是我们的幸运年啊。我出生年份的四位数字加起来刚好是我的年龄。表弟的也是如此。假设今年是2014年(2014年的题),并且,小明说的年龄指的是周岁。
请推断并填写出小明的出生年份。
这是一个4位整数,请通过浏览器提交答案,不要填写任何多余的内容(比如,他表弟的出生年份,或是他们的年龄等等)


Input


Output

输出一个4为整数

#include <iostream>
using namespace std;
int main()
{  
    int count=0;
    for(int i=1;i<30;i++)
    {
     int birthyear=2014-i;
     int temp=birthyear;
  int sum=0;
  while(temp>0)
  {
   int k=temp%10;
   sum=sum+k;
      temp=temp/10;
  }
  if(sum==i)
  {
  count++;
  if(count>1)
  {
      cout<<birthyear;
  
  break;
   }
  }
 }
 return 0;
}


啤酒的数量



Problem Description

啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。
 我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。
 注意:答案是一个整数。
不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。


Input


Output

输出一个整数
#include <iostream>
using namespace std;
int main()
{  
int  e_p=23;
 int e_y=19;
 int flag=0;
  for(int y=2;y<100;y++ )
  {
  for(int p=1;p<y;p++)
  {
   if((p*e_p+y*e_y)==823)
     {
      
      cout<<p;
      flag=1;
   break;
  }
  }
  if(flag==1)
  break;
  }
 return 0;
}




求另一个解

Problem Description

请看下面的算式:
 (ABCD - EFGH) * XY = 900
 每个字母代表一个0~9的数字,不同字母代表不同数字,首位不能为0。
 比如,(5012 - 4987) * 36 就是一个解。
 请找到另一个解,并提交该解中 ABCD 所代表的整数。

注意:只提交 ABCD 所代表的整数,不要写其它附加内容,比如:说明性的文字。


Input


Output

输出一个4为数的整数
#include <iostream>
using namespace std;
int a[10]={0};
int b[10]={1};
void dfs(int m)
{
 if(m>9)
 return;
 if(m=8)
 {
  if((a[0]*1000+a[1]*100+a[2]*10+a[3]-a[4]*1000+a[5]*100+a[6]*10+a[7])*(a[8]*10+a[9])==900)
  {
   cout<<a[0]<<a[1]<<a[2]<<a[3];
   return;
  }
 }
 for(int i=0;i<10;i++)
 {
  if(b[i]==1)
  {
   a[m]=i;
   b[i]=0;
   dfs(m+1);
   b[i]=1;
   
  }
 }
 
 
}
int main()
{  
    dfs(0);
 return 0;
}

Problem Description

小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。


Input


Output

输出一个整数
 #include <iostream>
 using namespace std;
 int main()
 {
 /**
 int a[13];   
          int count=0;
            for(a[0]=0; a[0]<=4; a[0]++)
            {
                for(a[1]=0; a[1]<=4; a[1]++)
                {
                    for(a[2]=0; a[2]<=4; a[2]++)
                    {
                        for(a[3]=0; a[3]<=4; a[3]++)
                        {
                            for(a[4]=0; a[4]<=4; a[4]++)
                            {
                                for(a[5]=0; a[5]<=4; a[5]++)
                                {
                                    for(a[6]=0; a[6]<=4; a[6]++)
                                    {   
                                        for(a[7]=0; a[7]<=4; a[7]++)
                                        {
                                            for(a[8]=0; a[8]<=4; a[8]++)
                                            {
                                                for(a[9]=0; a[9]<=4; a[9]++)
                                                {
                                                    for(a[10]=0; a[10]<=4; a[10]++)
                                                    {
                                                        for(a[11]=0; a[11]<=4; a[11]++)
                                                        {
                                                            for(a[12]=0; a[12]<=4; a[12]++)
                                                            {
                                                                if(a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9]+a[10]+a[11]+a[12]==13)
                                                                {
                                                                    count++;
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }   
                            }
                        }
                    }
                }
            }
           
            cout<<count;
            **/
            cout<<"3598180";
            return 0;
        }




Problem Description

小明正看着 203879 这个数字发呆。
 原来,203879 * 203879 = 41566646641
 这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。
 具有这样特点的6位数还有一个,请你找出它!
 再归纳一下筛选要求:
 1. 6位正整数
 2. 每个数位上的数字不同
 3. 其平方数的每个数位不含原数字的任何组成数位
答案是一个6位的正整数。

注意:只提交另一6位数,题中已经给出的这个不要提交。
注意:不要书写其它的内容(比如:说明性的文字)。
#include <iostream> 
using namespace std; 
int shu[6]={0};
bool check(int m)
{
 
 
 for(int i=0;i<6;i++)
 {
 if(m==shu[i])
 return false;
 }
 return true;
}

int main() 
{   
    int num;
    int flag=1;
     for(int a=1;a<10;a++)
     {
      for(int b=0;b<10;b++)
      {
       if(b==a)continue;
       for(int c=0;c<10;c++)
       {
        if(c==a||c==b)continue;
        for(int d=0;d<10;d++)
        {
         if(d==a||d==b||d==c)continue;
         for(int e=0;e<10;e++)
         {
          if(e==a||e==b||e==c||e==d)continue;
          for(int f=0;f<10;f++)
          {
       if(f==a||f==b||f==c||f==d||f==e)continue;
       shu[0]=a;
       shu[1]=b;
       shu[2]=c;
       shu[3]=d;
       shu[4]=e;
       shu[5]=f;
              num=a*100000+b*10000+c*1000+d*100+e*10+f;
             long int nn=num*num;
      
      long int temp=nn;
       while(temp>0)
       {
        int k=temp%10;
        if(check(k)==false)
        {
            flag=0;
          break; 
       }
       temp=temp/10;
       
       }
       if(flag==1)
       {
        cout<<a<<b<<c<<d<<e<<f;
      
       }
      
       }
      }
     }
    }
       
   }
  }
    return 0; 


Problem Description

小明从银行贷款3万元。约定分24个月,以等额本金方式还款。
 这种还款方式就是把贷款额度等分到24个月。每个月除了要还固定的本金外,还要还贷款余额在一个月中产生的利息。
 假设月利率是:0.005,即:千分之五。那么,
 第一个月,小明要还本金 1250, 还要还利息:30000 * 0.005,总计 1400.00
 第二个月,本金仍然要还 1250, 但利息为:(30000-1250) * 0.005 总计 1393.75
 请问:小明在第15个月,应该还款多少(本金和利息的总和)?
 请把答案金额四舍五入后,保留两位小数。注意:32.5,一定要写为:32.50
答案是一个含有小数点和两位小数的浮点数字。不要写多余内容(例如:多写了“元”或添加说明文字)


#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
 
 float sum;
 float ben=1250;
 sum=(30000-1250*14)*0.005+ben;
 printf("%.2f",sum); 
 return 0;
 }

Problem Description

小明看到一本书上写着:任何数字的立方都可以表示为连续奇数的和。
 比如:
2^3 = 8 = 3 + 5
3^3 = 27 = 7 + 9 + 11
4^3 = 64 = 1 + 3 + ... + 15
 虽然他没有想出怎么证明,但他想通过计算机进行验证。
 请你帮助小明写出 111 的立方之连续奇数和表示法的起始数字。如果有多个表示方案,选择起始数字小的方案。

注意:只提交一个整数,不要写其它附加内容,比如:说明性的文字。

#include <iostream>
using namespace std;
int main()
{
 int n=111;
 int nnn=n*n*n;
    int sum=0;
    int flag=0;
 for(int i=1;i<nnn;i=i+2)
   {
     sum=i;
    for(int j=i+2;j<nnn;j=j+2)
    {
     sum=sum+j;
     if(sum>nnn)
     break;
     if(sum==nnn)
     {
      cout<<i;
      flag=1;
      break;
      
     }
  
  }
  if(flag==1)
  break;
    
   }
 return 0;
 }

Problem Description

如果把一个正整数的每一位都平方后再求和,得到一个新的正整数。
对新产生的正整数再做同样的处理。
如此一来,你会发现,不管开始取的是什么数字,
最终如果不是落入1,就是落入同一个循环圈。
请写出这个循环圈中最大的那个数字。
请填写该最大数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
#include <iostream> 
#include <vector>
#include <algorithm>
using namespace std; 
int main() 

      vector <int> a;
      int num=5123123;
      for(int i=0;i<100000;i++)
      {
       int temp=num;
       num=0;
       while(temp>0)
       {
        int k=temp%10;
        num=num+k*k;
        temp=temp/10;
    }
    a.push_back(num);
   }
   sort(a.rbegin(),a.rend());
   cout<<a[0];
    return 0; 


填数游戏

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)

Total Submission(s) : 9   Accepted Submission(s) : 7

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

如图(见QQ群)所示六角形中,填入1~12的数字。 使得每条直线上的数字之和都相同。
 图中已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
#include<stdio.h>
#include<string.h>
int t[6];
int num[12];
void dfs(int cur){
 t[0]=num[1]+num[4]+num[7]+num[9];
 t[1]=num[2]+num[5]+num[4]+num[6];
 t[2]=num[1]+num[5]+num[8]+num[12];
 t[3]=num[6]+num[8]+num[11]+num[3];
 t[4]=num[9]+num[10]+num[11]+num[12];
 t[5]=num[2]+num[7]+num[10]+num[3];
 //恰好放置12个数字,+1为13
 if(cur==13){
 //六个边的和恰好相同
 if(t[0]==t[1] && t[1]==t[2] && t[2]==t[3] && t[3]==t[4] && t[4]==t[5] &&t[5]==t[0])
 //打印结果
 for(int f=1;f<=12;f++)
 printf("%d ",num[f]);
 }
 //否则继续放置数字,从1开始逐个放置
 else for(int i=1;i<=12;i++){
 //标记变量
 int ok=1;
 for(int j=1;j<cur;j++){
 //检查当前放置的数字是否在此之前放置过
 if(num[j]==i)
 ok=0; //如果放置过标记变量为0
 }
 if(ok){
 //放置该数字
 num[cur]=i;
 //进行下一步搜索
 dfs(cur+1);
 }
 }
}
int main(){
 num[1]=1;num[2]=8;num[3]=3;
 dfs(4);
 return 0;
}

Problem Description

A 村的元宵节灯会上有一迷题:
 请猜谜 * 请猜谜 = 请边赏灯边猜
 小明想,一定是每个汉字代表一个数字,不同的汉字代表不同的数字。
 请你用计算机按小明的思路算一下,然后提交“请猜谜”三个字所代表的整数即可。
注意:只提交一个3位的整数,不要写其它附加内容,比如:说明性的文字。

#include<iostream>  
 using namespace std; 

void find() 
 { 
     for(int q = 0;q <= 9;q++) 
         for(int c = 0;c <= 9;c++) 
    for(int m = 0;m <= 9;m++) 
     for(int b = 0;b <= 9;b++) 
      for(int s = 0;s <= 9;s++) 
       for(int d = 0;d <= 9;d++) 
       { 
        int cc[10] = {0}; 
        cc[q]++; 
        cc[c]++; 
                             cc[m]++; 
        cc[b]++; 
        cc[s]++; 
        cc[d]++; 
        if(cc[q]==1 && cc[c]==1 && cc[m]==1 && cc[b]==1 && cc[s]==1 && cc[d]==1 ) 
        { 
                                
         int qcm = q*100 + c*10 + m; 
         int qbsdbc = q*100000 + b*10000 + s*1000 + d*100 + b*10 + c; 
         if(qcm*qcm == qbsdbc) 
         { 
          cout<<qcm; 
                                 } 
        } 
                         } 
 } 

int main() 
 { 
  find();
  return 0;
 }
 
Problem Description

由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
 比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
 都符合要求。
 如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
#include <iostream>
using namespace std;
int a[4];
 
bool check()
{
 if(a[0]!=a[1]&&a[0]!=a[2]&&a[0]!=a[3]&&a[1]!=a[2]&&a[1]!=a[3]&&a[2]!=a[3])
 return true;
 else
 return false;
 }

int main()
{  
    int count=0;
    int count2=0;
    for(int i=1000;i<10000;i++)
    {  
        int temp=i;
     for(int j=0;j<4;j++)
     {
         a[j]=temp%10;
   temp=temp/10; 
  }
  
  if(check()==true)
  {
   for(int m=0;m<4;m++)
   {
    for(int n=0;n<4;n++)
    {
     if(m==n)continue;
     for(int k=0;k<4;k++)
     {
      if(k==m||k==n)continue;
      for(int l=0;l<4;l++)
      {
       if(l==m||l==n||l==k)continue;
       
       if(a[m]*(a[n]*100+a[k]*10+a[l])==i)
       count++;
       
       if((a[m]*10+a[n])*(a[k]*10+a[l])==i)
       count2++;
       
      }
     }
    }
   }
   
   
  }
     
 }
// cout<<count<<endl;
// cout<<count2/2<<endl;
 
 count=count+count2/2;
 
 cout<<count;
 return 0;
}

Problem Description

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

这种价牌有个特点,对一些数字,倒过来看也是合理的数字。如:1 2 5 6 8 9 0 都可以。这样一来,如果牌子挂倒了,有可能完全变成了另一个价格,比如:1958 倒着挂就是:8561,差了几千元啊!!
 当然,多数情况不能倒读,比如,1110 就不能倒过来,因为0不能作为开始数字。
 有一天,悲剧终于发生了。某个店员不小心把店里的某两个价格牌给挂倒了。并且这两个价格牌的电视机都卖出去了!
 庆幸的是价格出入不大,其中一个价牌赔了2百多,另一个价牌却赚了8百多,综合起来,反而多赚了558元。
 请根据这些信息计算:赔钱的那个价牌正确的价格应该是多少?
答案是一个4位的整数。
注意:不要提交解答过程,或其它辅助说明类的内容。

#include <iostream>
using namespace std;
int nums[7]={1,2,5,6,8,9,0};

int turn(int m)
{
 if(m==6)
   return 9;
 else if(m==9)
 return 6;
 else
 return m;
 
}

int change(int m)
{   
    int result=0;
     int temp=m;
 while(temp>0)
 {
  int k=temp%10;
  result=result*10+k;
  temp=temp/10;
 }
 return result;
}

int main()
{  
 int flag=0;
  for(int a=0;a<6;a++)
    {  
     if(flag==1)
     {
      break;
  }
     for(int b=0;b<7;b++)
     {
      if(flag==1)
     {
      break;
  }
      for(int c=0;c<7;c++)
      {
       if(flag==1)
     {
      break;
  }
       for(int d=0;d<7;d++)
       {
        if(flag==1)
     {
      break;
  }
         for(int e=0;e<6;e++)
                   {
                    if(flag==1)
     {
      break;
  }
                       for(int f=0;f<7;f++)
                     {
                      if(flag==1)
     {
      break;
  }
                           for(int g=0;g<7;g++)
                       {
                        if(flag==1)
     {
      break;
  }
                              for(int h=0;h<7;h++)
                        {    
                           
                            int A=nums[a];
                            int B=nums[b];
                            int C=nums[c];
                            int D=nums[d];
         int E=nums[e];
                            int F=nums[f];
                            int G=nums[g];
                            int H=nums[h];
                            
          int num1=A*1000+B*100+C*10+D;
                         int num2=E*1000+F*100+G*10+H;
                          
                            A=turn(nums[a]);
                            B=turn(nums[b]);
                            C=turn(nums[c]);
                            D=turn(nums[d]);
            E=turn(nums[e]);
                            F=turn(nums[f]);
                            G=turn(nums[g]);
                            H=turn(nums[h]);
                       
                          int num1_c=A*1000+B*100+C*10+D;
                          int num2_c=E*1000+F*100+G*10+H;
                       
          num1_c=change(num1_c);
                         num2_c=change(num2_c);
                        
          int cha=num2_c+num1_c-num1-num2;
                      
             if(num1-num1_c>200&&num1-num1_c<300&&num2_c-num2>800&&num2_c-num2<900&&cha==558)
                           {
                              cout<<num1;
                                flag=1;
                             break;
          }
                     }
                    }
                 }
     
     
                }
    }
   }
  }
     
     
  }
 return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值