L1-080 乘法口诀数列*(使用C++)

  • Post category:C++
L1-080 乘法口诀数列

分数 20
作者 陈越
单位 浙江大学

 

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

输入格式:

输入在一行中给出 3 个整数,依次为 a1a2 和 n,满足 0a1,a29,0<n103。

输出格式:

在一行中输出数列的前 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 后结束。

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

 
解题思路:
理解题目花了不少时间不过总体上还算简单,大概意思就是说要自己建立一个数列,给出数列的开头俩个a1 a2,这个数列的规则是这样的a3=a1*a2,a4=a3*a2…如果a1*a2得出来的a3是俩位数那么还要把这俩位数分开独立放进数组(a3=(a1*a2)/10,a4=(a1*a2)%10)
所以关键点在于需要俩个变量维护数列数组arr[],一个下标i来进行常规计算,另一个下标bits来给乘出来的数放到数组arr[]的末尾(因为一次尾插可能是1个数也可能是2个数)
最后别忘了输出的最后一个数是没有空格的()
 
 
代码部分:
 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 int a1,a2,n,arr[1003];
 5 int bits=2;
 6 int main()
 7 {
 8     cin>>a1>>a2>>n;
 9     arr[1]=a1,arr[2]=a2;
10     for(int i=2;bits<=n;i++,bits++)
11     {
12         int sum=arr[i]*arr[i-1];
13         if(sum>=10)
14         {
15             int num1=sum/10,num2=sum%10;
16             arr[bits+1]=num1;
17             bits++;
18             arr[bits+1]=num2;
19         }
20         else if(sum<=-10)
21         {
22             int num1=sum/10,num2=abs(sum%10);
23             arr[bits+1]=num1;
24             bits++;
25             arr[bits+1]=num2;
26         }
27         else
28         {
29             arr[bits+1]=sum;
30         }
31     }
32     for(int i=1;i<=n;i++)
33     {
34         if(i==n)
35         {
36             bits=i;
37             break;
38         }
39         cout<<arr[i]<<" ";
40     }
41     cout<<arr[bits];
42     return 0;
43 }