“蓝桥杯”模拟法(四)——杨辉三角、猴子选大王
1. 杨辉三 角(2021年试题H) (答案见下期)
【问题描述】
下图是著名的杨辉三角 。

如果按从上到下、从左到右的顺序把所有数排成一列,则可以得到如下数列:1,1,1,1,2,1,3,3,1,1,4,6,4,1,1,5,10,10,5,1…… 给定一个正整数N,请你输出数列中N第一次出现是在第几个数的位置?
[输入格式]
输入一个整数N。
[输出格式]
输出一个整数,代表答案。
[样例输 入]
6
[样例输出]
13
[样例输 入]
2
[样例输出]
5
练习2:猴子选大王
【题目描述】
有n只猴子按顺时针方向围成一圈选猴王(编号从 1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外。剩下的猴子再接着从1开始报数,,就这样,直到圈内只剩下一只猴子时,这只猴子就是猴王。编程输入n和m,输出猴王的编号。
[输入格式]
每行是用空格分开的两个整数。第一个是n,第二个是m(0<m,n<300)。最后一行是00。
[输出格式]
对于每行输入数据(最后行除外) 输出数据也是 一行,即猴王的编号。
[输入样例]
6 2
12 4
8 3 0 0
[输出样例]
5
1
7
3.上期答案——整数拼接
三位同学写得都很好,思路是一样的,先计算出每个整数的位数。
如果n1的位数是len1,n2的位数是len2
N1拼接n2是:n1×10len2+n2;
N2 拼接n1是:n2×10len1+n1;
书写代码略有不同,同学们参考,希望能给你启发。
【参考程序一】——申茂生答案
#include <iostream>
using namespace std;
int kkk(int a,int b,int k)//一个判断函数,判断a拼接上b是否为k的倍数
{
unsigned long long c;
for(int i=1,j=1;j<10;i*=10,j++)
{
if(b>=i&&b<=i*10)//判断b是几位数
{
c=a*i*10+b;//a拼接上b
if(c%k)
return 0;
else
return 1;
}
}
}
int main()
{
int n,k,sum=0;//sum记录有几种拼法
cin>>n>>k;
int num[n];
for(int i=0;i<n;i++)
{
cin>>num[i];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i!=j)//i不等于j
if(kkk(num[i],num[j],k))//判断a拼接上b是否为k的倍数
sum++;
}
}
cout<<sum;//输出有几种拼法
}
【参考程序二】——冯老师答案
#include <iostream>
#include <math.h>
using namespace std;
int digitNums(int n) //返回整数n的位数
{ int res=0;
while(n)
{
res++;
n=n/10;
}
return res;
}
int main()
{
int n,k,counts=0;;
cout<<"input n and k:";
cin>>n>>k;
int *a=new int[n];//n个整型数据
cout<<"input "<< n <<" integers:";
for(int i=0;i<n;i++) //输入n个整数
cin>>a[i] ;
int ai,aj;
for(int i=0;i<n;i++)
{ int ai=a[i];
for(int j=0;j<n;j++)
{
if(j!=i)
{
aj=a[j];
int ni=digitNums(ai),nj=digitNums(aj);
//如果ai是123,ni=3;aj是45,nj=2
//ni和nj是ai和aj 数据的位数
unsigned long long nn= ai*pow(10,nj)+aj;
//nn=123*100+45
if(nn%k==0)
counts++; //计数器加1
}
}
}
cout<< counts<<endl;
return 0;
}
【参考程序三】——吴炳毅答案
#include <iostream>
using namespace std;
int A(int a){
int num=1;
while(a/10)
{
num++;
a=a/10;
}
return num;
}
int main() {
int n,k;
cin>>n>>k;
unsigned long long ac[n],b=0;
int num=0;
for(int i=0;i<n;i++)
{
cin>>ac[i];/*存储数据*/
}
int bc[n];
for(int i=0;i<n;i++)
{
bc[i]=A(ac[i]);/*存储每个数的位数*/
}
for(int i=0;i<n;i++)
{
for(int j=n-1;j>i;j--)
{
b=ac[i];
for(int k=0;k<bc[j];k++)b=b*10;
b+=ac[j];
if(b%k==0)num++;
b=ac[j];
for(int k=0;k<bc[i];k++)b=b*10;
b+=ac[i];
if(b%k==0)num++;
}
}
cout<<num;
}
【参考程序四】——刘策答案
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 10010;
LL a[N];
LL judge(int x)
{
LL len = 0, t = 1;
while (x)
{
x /= 10;
len++;
}
for (int i = 1; i <= len; i++) t *= 10;
return t;
}
int main()
{
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> a[i];
LL ans = 0;
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++)
{
LL p = judge(a[i]), q = judge(a[j]);
LL x = a[i] * q + a[j];
LL y = a[j] * p + a[i];
if (x % k == 0) ans++;
if (y % k == 0) ans++;
}
cout << ans << endl;
return 0;
}
4.上期答案——卡片
【参考程序一】——申茂生
#include <iostream>
using namespace std;
int main()
{
int num=0,f=0;
int sum[10]={};//0到9的卡片
for(int i=0;i<10;i++)//每个卡片有2021张
sum[i]=4;
while(true)
{
num++;
int num1=num;
while(num1)//判断是否能拼到num
{
if(sum[num1%10]--)//若可以则对应卡片数量减一
{
}
else//若卡片数量为0则不能拼到num
{
f=1;
break;
}
num1/=10;
}
if(f==1)
break;
}
cout<<num-1;//输出能拼到的数
}
【参考程序二】——冯老师答案
#include <iostream>
#include <math.h>
using namespace std;
int oneNums(int n) //返回整数n中数字1的个数
{ int res=0;
while(n)
{
if(n%10==1)
{
res++;
}
n=n/10;
}
return res;
}
int main()
{
int n;
int sum=0;
int i=1;
while(true)
{
sum+=oneNums(i);//i中1的格式
if(sum>2021) break;
i++;
}
cout<< i-1<<endl; //减1是因为这一张无法凑出
return 0;
}

添加 家长论坛微信
全部 0条评论