题目
输入格式
输入第一行给出 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
思路
先说明,这道题我做复杂了,首先分情况,如果输入的点数为6,摇的次数为n,那么显然第n次的点数应该为6-n,如n=3,第一次为5,第二次4,第三次为3,即6-3。如果输入的点数小于6,设为a,例如输入点数3,n=2,那么第一次的点数为6,第二次点数为5,是6-n+1,如果输入点数3,n=4呢,那么点数依次为6,5,4,2,1,这里也需要分类讨论,即如果n>6-a,那么最后的点数必定是小于a,为a-(n-(6-a)),如何理解,6-a代表的是从a到6需要加多少次1,举个例子,a=3,n=4,6-a=3,代表了3次后的点数回到a+1,剩下还需要摇n-(6-a)次,即4-3=1次,而这1次,就需要从a开始减,即a-1(因为点数不能重复,不能再出现a),所以最后是a-(n-(6-a)),如果n>=6-a,这样好办,最后的点数为6-n+1。
代码
#include <stdio.h>
int main(){
int a[6];
int i=0;
for(i=0;i<6;i++){
scanf("%d",&a[i]);
}
int n;
scanf("%d",&n);
for(i=0;i<6;i++){
int j=0;
int b=a[i];
if(b==6) a[i]-=n;
else if(b<6){
if(n>6-b) a[i]=b-(n-(6-b));
else a[i]=6-n+1;
}
}
for(i=0;i<6;i++) {
printf("%d",a[i]);
if(i==5) printf("\n");
else printf(" ");
}
}
更好的方法
这里只给出关键代码。
在对点数<6的讨论时,如果当前点数等于初始点数,则不当前循环不算,即j不加1。显然当前点数=初始点数时,这次摇到初始点数,a继续减1,a[i]--,但摇的总次数不加1,即j不加1,然后再进入下次循环,使得j++,最后相当于摇了n次,注意初始值j=1,因为a[i]=6相当于第一次摇到6,已经摇了一次,所以后面的for循环是j=1到j=n-1,一共执行了n-1次。这样略去了上面的精确分类讨论,节省时间。
for(i=0;i<6;i++){
int b=a[i];
if(b==6) a[i]-=n;
else if(b<6){
a[i]=6;
for(j=1;j<n;){
a[i]--;
if(a[i]!=b){
j++;
}
}
}
}
总结
写代码要有计算机思维,灵活运用代码能高效提升编程效率。
写代码需要具备计算机思维,这是一种分析和解决问题的方式,强调逻辑思维和抽象能力。计算机思维能帮助程序员将复杂问题分解成简单的步骤,并设计有效的解决方案。它要求将问题抽象成数据结构和算法,以便计算机能够理解和处理。此外,计算机思维注重细节和精确性,防范可能的错误。编写代码时,程序员需要考虑到计算机的执行过程,明确每一步的逻辑关系。总体而言,具备计算机思维的能力有助于高效编写代码,提高问题解决的效率,培养良好的代码习惯,使得程序更加可靠、可维护。