[pta]L1-080 乘法口诀数列,L1-085 试试手气

  把我今天写题中的两道题的题解一起放一篇博客了

L1-080 乘法口诀数列

分数 20

作者 陈越

单位 浙江大学

本题要求你从任意给定的两个 1 位数字 a1​ 和 a2​ 开始,用乘法口诀生成一个数列 {an​},规则为从 a1​ 开始顺次进行,每次将当前数字与后面一个数字相乘,将结果贴在数列末尾。如果结果不是 1 位数,则其每一位都应成为数列的一项。

输入格式:

输入在一行中给出 3 个整数,依次为 a1​、a2​ 和 n,满足 0≤a1​,a2​≤9,0<n≤103。

输出格式:

在一行中输出数列的前 n 项。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:
2 3 10
输出样例:
2 3 6 1 8 6 8 4 8 4
样例解释:

数列前 2 项为 2 和 3。从 2 开始,因为 2×3=6,所以第 3 项是 6。因为 3×6=18,所以第 4、5 项分别是 1、8。依次类推…… 最后因为第 6 项有 6×8=48,对应第 10、11 项应该是 4、8。而因为只要求输出前 10 项,所以在输出 4 后结束。

我的想法:

观察可知,除了第一个数字和最后一个要用到的数字,在满足数组个数为n之前,都会被使用两遍,那很简单了,就只需要定义一个flag来记录下一次相乘要使用哪两个数字就行了,一开始的a和b都被记录到数组num内,记flag=1,每次相乘,flag++,那么下一次就是num[flag-1]*num[flag]了。用一个计数器ans来记录当前数组num已经有多少个元素了,因为数组内存的都是个位数,得到的结果只可能是两位数和个位数,如果是两位数,就先存十位的,再存个位的,如果是个位数,直接存到num就行了

#include <iostream>
using namespace std;
 int a,b,n,ans;
int num[1010];
int main()
{
   
    cin>>a>>b>>n;
    num[ans++]=a;num[ans++]=b;
    int flag=1;
    while(ans<n){
       int t=num[flag-1]*num[flag];
        flag++;
       if(t>=10){
           num[ans++]=t/10;
           num[ans++]=t%10;
          
       }else {
           num[ans++]=t;
       }
     
    }
    for(int i=0;i<n;i++){
        if(i)cout<<' ';
        cout<<num[i];
    }
    return 0;
}

L1-085 试试手气

分数 15

作者 陈越

单位 浙江大学

sz.png

我们知道一个骰子有 6 个面,分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件:

  • 1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同;
  • 2、在满足条件 1 的前提下,每次都能让每个骰子得到可能得到的最大点数。

那么你应该可以预知自己第 n 次(1≤n≤5)摇出的结果。

输入格式:

输入第一行给出 6 个骰子的初始点数,即 [1,6] 之间的整数,数字间以空格分隔;第二行给出摇的次数 n(1≤n≤5)。

输出格式:

在一行中顺序列出第 n 次摇出的每个骰子的点数。数字间必须以 1 个空格分隔,行首位不得有多余空格。

输入样例:
3 6 5 4 1 4
3

输出样例:
4 3 3 3 4 3

样例解释:

这 3 次摇出的结果依次为:

6 5 6 6 6 6
5 4 4 5 5 5
4 3 3 3 4 3

我的想法:

每个骰子都是有1到6的点数,然后除去输入的点数,每次摇出剩余的最大点数,输出第n次的最大点数。

那么设置一个7x7的数组a,表示6个骰子的点数,数组下标从1开始用,每一行都初始化为【0,1,2,3,4,5,6】,初始化完数组a之后,就开始输入骰子的初始点数,把数组a对应下标为初始点数的元素值赋值为0,标记这个点数后续不能用,后面来一个遍历,设置一个计数器ans,数组每一行倒序用,只要数组元素值不是0,ans++,加到ans==n就是我们想要的结果

#include <iostream>
using namespace std;
int a[7][7],n;
int main()
{
    for(int i=1;i<=6;i++){
        for(int j=1;j<=6;j++)a[i][j]=j;
    }
    for(int i=1;i<=6;i++){
        int x=0;cin>>x;
        a[i][x]=0;
    }
    cin>>n;
    
    for(int i=1;i<=6;i++){
        int ans=0;
        if(i!=1)cout<<' ';
        for(int j=6;j>=1;j--){
          if(a[i][j])ans++;
            if(ans==n){
                cout<<a[i][j];break;
            }
        }
    }
    cout<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值