把我今天写题中的两道题的题解一起放一篇博客了
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
作者 陈越
单位 浙江大学

我们知道一个骰子有 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;
}

2156

被折叠的 条评论
为什么被折叠?



