文章目录
L1-080 乘法口诀数列
题目描述
本题要求你从任意给定的两个 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项。代码的逻辑是从任意给定的两个一位数字a1
和a2
开始,通过乘法操作逐步扩展数列,直到达到所需的长度。下面是对代码的详细注释。
#include<bits/stdc++.h> // 引入常用库,包括输入输出流、数据结构等
using namespace std;
const int z=1e3+10; // 定义数组的最大长度,略大于题目要求的n的最大值1000
int num[z]; // 定义一个全局数组num,用来存储生成的数列
int main()
{
int a1,a2,n; // 定义输入的两个一位数字a1、a2和要输出的数列长度n
cin>>a1>>a2>>n; // 输入a1、a2和n
num[0]=a1; // 将a1赋值给数列的第一个元素
num[1]=a2; // 将a2赋值给数列的第二个元素
int j=2; // 定义一个指针j,指向数列的下一个填充位置
for(int i=0;i<n;i++)
{
int sum=num[i]*num[i+1]; // 计算当前元素与其后一个元素的乘积
if(sum>=10) // 如果乘积是两位数
{
num[j++]=sum/10; // 将十位数作为数列的下一个元素
num[j++]=sum%10; // 将个位数作为数列的下一个元素
}
else num[j++]=sum; // 如果乘积是一位数,直接将其作为数列的下一个元素
}
for(int i=0;i<n;i++) // 遍历数列的前n项进行输出
{
if(i!=n-1)
cout<<num[i]<<" "; // 如果不是最后一个元素,输出后加空格
else
cout<<num[i]; // 如果是最后一个元素,直接输出,不加空格
}
return 0; // 程序结束
}
这段代码巧妙地利用数组num
来逐个生成数列的元素。通过不断地计算当前元素和其后一个元素的乘积,并根据乘积的位数决定如何扩展数列,以此实现数列的生成。注意,虽然for
循环的条件是i<n
,但实际上,当j
(即数列的实际长度)达到或超过n
时,后续的元素将不会再被加入数列中,因此生成的数列正好满足输出前n项的要求。最后的输出逻辑确保了输出格式的正确性,即数列元素之间以单个空格分隔,行首尾没有多余的空格。