【无标题】PTA,乘法口诀数列

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

Top1

乘法口诀数列

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

输入格式:
输入在一行中给出3个整数,依次为 a1 、a 2和 n,满足0≤a1,a2≤9,0<n≤10^3。

在这里插入图片描述

思路
用数组保存乘出来的数,十位放在个位的前头,注意所得的下标移动

#include <stdio.h>
int main()
{   int ge,shi,i;       //ge保存两个数相乘所得的个位,shi保存两个数相乘所得的十位
    int n,m,k,count = 2; 
    int place1=0,place2=1;          //place1和place2分别记录两个数要相乘数组下标的移动位置
    scanf("%d%d%d",&n,&m,&k);       
    int time =k;                      //先保存要输出的数列的深度
    int a[10000]={n,m};      //创建数据存放数据;
    while(k)
    {
        int x = a[place1]*a[place2];
         //将两数相乘结果分为[0,9] 和 [10,81] 讨论
        if(x<=9) {               
            a[count] = x;
            count++;
        } else {
               ge = x%10;
                shi =x/10%10;
                a[count] = shi;           //先将十位放数组里
                a[count+1] = ge;         //个位放十位后头
              count+=2;                  //下次放数据的下标则移动到十位的后面
        }
        place1++;                //乘数1的位置移动到乘数2的位置
        place2++;                //乘数2的位置移动的后一位
        k--;
    }
    for(i=0;i<time;i++) 
    {
       printf("%d",a[i]);
       if(i<time-1) printf(" ");
    }
    return 0;
}

Top2

试试手气(丢骰子)

在这里插入图片描述

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

1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同;
2、在满足条件 1 的前提下,每次都能让每个骰子得到可能得到的最大点数。
那么你应该可以预知自己第 n 次(1≤n≤5)摇出的结果。

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

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

在这里插入图片描述

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    int N=6,n,i;
    int a[7]={0},b[7];
    for(i=1;i<7;i++)
    {
         scanf("%d",&a[i]);
           b[i] = a[i];           //b[i]为对照的数组,统计第一次输入的骰子点数
    }
    scanf("%d",&n);
    //先将第一次摇预设出来为最大值6,加入初态为6,则第一次为5,方便后面统计
    for(i=1;i<7;i++)
    {
        if(a[i]==6) a[i]-=1;        //如果初始状态为最大点数,则其第一次结果为5
        else a[i]=6;                //否则第一次为6
    } 
    int k=n;                           //临时保存要摇的次数
    for(i=1;i<7;i++)                     //循环输出6个骰子面
    {
        while(n-1)                   //因为第一次在上面遍历过了,所以每个骰子摇的次数-1
        {
            a[i]-=1;                    //当前的骰子面先-1
        if(a[i]==b[i]) {            //看是否会等于初始状态的点数,如果相等,就-1
            a[i]-=1;
        }
            n--;
        }
        n=k;
       printf("%d",a[i]);
      if(i<6) printf(" ");
    }
    return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值