试试手气题解

题目

输入格式

输入第一行给出 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++;
    		}		
		}
    }
}

总结

写代码要有计算机思维,灵活运用代码能高效提升编程效率。

写代码需要具备计算机思维,这是一种分析和解决问题的方式,强调逻辑思维和抽象能力。计算机思维能帮助程序员将复杂问题分解成简单的步骤,并设计有效的解决方案。它要求将问题抽象成数据结构和算法,以便计算机能够理解和处理。此外,计算机思维注重细节和精确性,防范可能的错误。编写代码时,程序员需要考虑到计算机的执行过程,明确每一步的逻辑关系。总体而言,具备计算机思维的能力有助于高效编写代码,提高问题解决的效率,培养良好的代码习惯,使得程序更加可靠、可维护。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值