第六屆藍橋杯省賽C語言B組
獎券數目

題意:
需要發出的獎券號碼從10000-99999,但發出條件是這些號碼里面不能含有數字4,問一共能發出多少張獎券,
思路:
把數字拆分,寫入判斷條件,再從10000到99999跑一遍回圈,
代碼
方法一:由于資料不大,就直接暴力列舉,
#include<bits/stdc++.h>
using namespace std;
int main()
{
int sum=99999-10000+1;//獎券總數目
for(int i=10000;i<=99999;i++)//把每一位都列舉出來
{
int a=i/10000;
int b=i%10000/1000;
int c=i%1000/100;
int d=i%100/10;
int e=i%10;
if(a==4||b==4||c==4||d==4||e==4)//寫入判斷條件
sum--;
}
cout<<sum<<endl;
return 0;
}
//答案52488
方法二:針對多位數的數字拆分
#include<bits/stdc++.h>
using namespace std;
bool fun(int n)
{
while(n)//把數字拆分
{
int x=n%10;
if(x==4)//滿足條件
return true;
n=n/10;
}
}
int main()
{
int sum=99999-10000+1;//獎券總數目
for(int i=10000;i<=99999;i++)
{
if(fun(i))//滿足條件
sum--;
}
cout<<sum<<endl;
return 0;
}
星系炸彈

方法一:
聽說可以使用電腦自帶計算器,就直接輸入時間就行,由于只能輸入的天數至多為999天,超過的就自己筆算吧,

方法二:
使用Excel表格,右鍵A與B,設定為日期模式,后在A里面輸入日期,在B中輸入=A1+1000,后enter,


答案就是2017-08-05(2017年8月5日)
三羊獻瑞

題意:
這些文字由0-9不同的數字組成,并且這些數字組成的文字需要滿足題中的等式,
思路一:
暴力列舉(就是費鍵盤,且代碼行數多)
代碼
#include<bits/stdc++.h>
using namespace std;
//祥a;瑞b;生c;輝d;三e;羊f;獻g;氣h;
int main()
{
for(int a=1;a<=9;a++)
{for(int b=0;b<=9;b++)
{if(b==a)continue;
{for(int c=0;c<=9;c++)
{if(c==a||c==b)continue;
{for(int d=0;d<=9;d++)
{if(d==a||d==b||d==c)continue;
{for(int e=1;e<=9;e++)
{if(e==a||e==b||e==c||e==d)continue;
{for(int f=0;f<=9;f++)
{if(f==a||f==b||f==c||f==d||f==e)continue;
{for(int g=0;g<=9;g++)
{if(g==a||g==b||g==c||g==d||g==e||g==f)continue;
{for(int h=0;h<=9;h++)
{if(h==a||h==b||h==c||h==d||h==e||h==f||h==g)continue;
{if(a*1000+b*100+c*10+d+e*1000+f*100+g*10+b==e*10000+f*1000+c*100+b*10+h)
cout<<e<<" "<<f<<" "<<g<<" "<<b<<endl;
}}}}}}}} }}}}}}}}
//答案:1 0 8 5
思路二:
全排列
代碼
//全排列
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[10];
for(int i=0;i<10;i++)
a[i]=i;
do{
if(!a[0]||!a[4])continue;//每個數的第一位不能為0
int x=a[0]*1000+a[1]*100+a[2]*10+a[3];
int y=a[4]*1000+a[5]*100+a[6]*10+a[1];
int z=a[4]*10000+a[5]*1000+a[2]*100+a[1]*10+a[7];
if(x+y==z)
cout<<x<<" "<<y<<" "<<z<<endl;
}while(next_permutation(a,a+10));
}
//答案 1 0 8 5
加法變乘法

題意:
根據題目中給的一串數字相加,改變其中兩個不相鄰的加號,使得結果為2015,
思路:
寫兩層for回圈為了找出需要改變加號的位置,里面寫入判斷條件,
代碼
#include<bits/stdc++.h>
using namespace std;
int main()
{
for(int i=1;i<=49;i++)
{
for(int j=i+1;j<=49;j++)
{
if(1225+i*(i+1)+j*(j+1)-(i+i+1+j+j+1)==2015)
cout<<i<<" "<<j<<endl;
} }return 0;}
//答案10 27//16 24
牌型種數

題意:
一副牌52張,發給四個人,每個人13張,不考慮花色,問一個人發到13張牌,其中組合共有多少種?
思路:
總共有13種牌,每一種牌有4張,對于每一種牌,抽取有5種情況,得到0,1,2,3,4牌,用times表示抽取的次數,sum表示手里的牌數,必須times=13,且手里的牌也等于13,組合數才能加1
方法一:暴力
代碼
#include <iostream>
using namespace std;
int main()
{
int sum=0;
for(int a=0; a<=4; a++)
for(int b=0; b<=4; b++)
for(int c=0; c<=4; c++)
for(int d=0; d<=4; d++)
for(int e=0; e<=4; e++)
for(int f=0; f<=4; f++)
for(int g=0; g<=4; g++)
for(int h=0; h<=4; h++)
for(int i=0; i<=4; i++)
for(int j=0; j<=4; j++)
for(int k=0; k<=4; k++)
for(int l=0; l<=4; l++)
for(int m=0; m<=4; m++)
{if(a+b+c+d+e+f+g+h+i+j+k+l+m==13)
sum++;}
cout<<sum<<endl;
return 0;}
//答案3598180
方法二:dfs
#include<bits/stdc++.h>
using namespace std;
int num=0;//統計方案次數
void dfs(int times,int sum)
{//times表示抽取次數,sum表示手中紙牌數量
if(times>13||sum>13)//邊界
{
return ;
}
if(times==13&&sum==13)//滿足條件
{
num++;
return ;
}
for(int i=0;i<5;i++)//每次抽取情況有五種,0,1,2,3,4張
{
sum+=i;
dfs(times+1,sum);
sum-=i;//回溯
}
}
int main()
{
dfs(0,0);
cout<<num<<endl;
return 0;
}
//答案3598180
移動距離


題意:
按照題目中的數字排位置,問其中任意兩點的距離,
思路:
將輸入的兩個點的橫坐標與縱坐標求出,后進行相減,求橫縱坐標需要依情況而寫,具體看代碼,
代碼
#include<bits/stdc++.h>
using namespace std;
int main()
{
int w,m,n;
while(cin>>w>>m>>n)
{
int x1,x2,y1,y2;
x1=m%w==0?m/w:m/w+1;
x2=n%w==0?n/w:n/w+1;
y1=x1%2==0?m-(x1-1)*w:x1*w-m+1;
y2=x2%2==0?n-(x2-1)*w:x2*w-n+1;
cout<<abs(x1-x2)+abs(y1-y2)<<endl;
}return 0;
}
后面兩道編程不會,求大佬教
如果覺得寫的還不錯點個贊吧!比心
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/271470.html
標籤:其他
上一篇:某人的2021年3月月總結
下一篇:手寫深拷貝及深拷貝理解
