列出3个骰子每种可能和值的所有骰子情况

lifeisshortyouneed 2013-07-04 11:21:25
本题纯属娱乐呵,大家来玩一下。

有3个相同的骰子,扔出的和值当然可能是3,4,5,...18
要求列出所有和值的骰子情况,打印出的格式类似如下即可:
3:1 1 1
4:1 1 2
5:1 1 3 ,1 2 2
.
.
.
18: 6 6 6


看看谁有最简单的代码打印出来啊
...全文
970 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
橡木疙瘩 2013-07-08
  • 打赏
  • 举报
回复
再写一个非递归:

#include <stdio.h>

int first_group( int data[], int size, int sum)
{
    int i = size - 1;
    while( i >= 0 && sum > 0 )
    {
        int value = sum - i;
        value = value > 6 ? 6 : value;
        value = value < 1 ? 1 : value;
        data[ i ] = value;
        sum -= value;
        -- i;
    }
    return i < 0 && sum == 0;
}

int next_group( int data[], int size )
{
    int i = 0;
    int result = 0;
    while( i < size - 1 && data[i] > data[i + 1] - 2)
    {
        ++ i;
    }
    if( i < size - 1 )
    {
        ++ data[i];
        -- data[i + 1];
        result = 1;
    }
    return result;
}

#define COUNT 3

int main()
{
    int data[COUNT];
    int i;
    for( i = 0; i <= 6 * COUNT; ++ i)
    {
        int next = first_group( data, COUNT, i);
        if( next )
        {
            printf("\n%d:", i);
        }
        while(next )
        { 
            int j;
            char prefix = ' ';
            for( j = 0; j < COUNT; ++ j)
            {
                printf("%c%d", prefix, data[j]);
                prefix = ',';
            }
            next = next_group( data, COUNT );
        }
    }
    return 0;
}
其实最简单的代码是三重循环,就是不能适应骰子的数量变化:
#include <stdio.h>

#define min(x, y) ((x) < (y) ? (x) : (y))
int main()
{
    int i, j, k, sum;

    for( sum = 3; sum <= 18; ++ sum)
    {
        printf( "%d:", sum);
        for(i = 1; i <= min(sum, 6); ++ i )
        {
            for( j = i; j <= min(sum - i, 6); ++ j)
            {
                k = sum - i - j;
                if( k <= 6 && k >= j)
                {
                    printf( " %d,%d,%d", i, j, k);
                }
            }
        }
        printf("\n");
    }
    return 0;
}
赵4老师 2013-07-08
  • 打赏
  • 举报
回复
现场剽窃2楼代码:
//有3个相同的骰子,扔出的和值当然可能是3,4,5,...18
//要求列出所有和值的骰子情况,打印出的格式类似如下即可:
// 3: 1,1,1
// 4: 1,1,2
// 5: 1,1,3 1,2,2
//.
//.
//.
//18: 6,6,6
#include <stdio.h>
void output(int sum,char *buffer,int level,int max) {
    if (sum>=level && sum<=level*max) {
        if (level==1) {
            * --buffer="0123456789"[sum];
            * --buffer=' ';
            printf("%s",buffer);
        } else {
            int i=sum-level+1;
            if(i>max) i=max;
            for(;i>0;--i) {
                char *my_buffer=buffer;
                * --my_buffer="0123456789"[i];
                * --my_buffer=',';
                output(sum-i,my_buffer,level-1,i);
            }
        }
    }
}
int main() {
    int i;
    char buffer[20];

    buffer[19]='\0';
    for(i=3;i<=18;++i) {
        printf("\n%2d:",i);
        output(i,&buffer[19],3,6);
    }
    return 0;
}
//
// 3: 1,1,1
// 4: 1,1,2
// 5: 1,1,3 1,2,2
// 6: 1,1,4 1,2,3 2,2,2
// 7: 1,1,5 1,2,4 1,3,3 2,2,3
// 8: 1,1,6 1,2,5 1,3,4 2,2,4 2,3,3
// 9: 1,2,6 1,3,5 2,2,5 1,4,4 2,3,4 3,3,3
//10: 1,3,6 2,2,6 1,4,5 2,3,5 2,4,4 3,3,4
//11: 1,4,6 2,3,6 1,5,5 2,4,5 3,3,5 3,4,4
//12: 1,5,6 2,4,6 3,3,6 2,5,5 3,4,5 4,4,4
//13: 1,6,6 2,5,6 3,4,6 3,5,5 4,4,5
//14: 2,6,6 3,5,6 4,4,6 4,5,5
//15: 3,6,6 4,5,6 5,5,5
//16: 4,6,6 5,5,6
//17: 5,6,6
//18: 6,6,6
lifeisshortyouneed 2013-07-08
  • 打赏
  • 举报
回复
2楼的递归 不错哟
erqieshi 2013-07-08
  • 打赏
  • 举报
回复

if (strIn[n]<'6')//找到那個小於'6'的數
            {
                strIn[n]++;
                for (int i = n;i<COUNT;i++)
                {
                    strIn[i] = strIn[n];//這個是組合
//strIn[i] = '1';//這個就是排列了
                }
                return 0;
            }
erqieshi 2013-07-08
  • 打赏
  • 举报
回复
輸出 111 112 113 114 115 116 122 123 124 125 126 133 ... 456 466 555 556 566 666
erqieshi 2013-07-08
  • 打赏
  • 举报
回复

#define COUNT 3
int ADD(char* strIn)
{
    
    if( '1' <= strIn[COUNT-1] &&  '6' > strIn[COUNT-1] )
		
    {
        strIn[COUNT-1]++;
        return 0;
    }
    else/*if('Z' == strIn[n])*///要进一位
    {
		int n = COUNT;        
		while(n-->0)
        {
			if (strIn[n]<'6')//找到那個小於'6'的數
			{
				strIn[n]++;
				for (int i = n;i<COUNT;i++)
				{
					strIn[i] = strIn[n];
				}
				return 0;
			}
		}
		return 1;//沒找到小於'6'的,說明迭代到最大數‘666’了

    }
	
}
int main()
{
	char str[COUNT+1] = "111";
	do 
	{
		printf(str);
		printf("\n");
	} while (!ADD(str));
	system("pause");
	return 0;
}
橡木疙瘩 2013-07-04
  • 打赏
  • 举报
回复
#include <stdio.h>
void output( int sum, char * buffer, int level, int max )
{
    if( sum >= level && sum <= level * max )
    {
        if ( level == 1 )
        {
            * --buffer = "0123456789"[sum];
            * --buffer = ' ';
            printf("%s", buffer);
        }
        else
        {
            int i = sum - level + 1;
            if( i > max )
            {
                i = max;
            }
            for(; i > 0; -- i)
            {
                char * my_buffer = buffer;
                * -- my_buffer = "0123456789"[i];
                * -- my_buffer = ',';
                output( sum - i, my_buffer, level - 1, i );
            }
        }
    }
}

int main()
{
    int i;
    char buffer[20];
    buffer[19] = '\0';
    for( i = 3; i <= 18; ++ i)
    {
        printf("\n%d: ", i);
        output(i, &buffer[19], 3, 6);
    }
}
赵4老师 2013-07-04
  • 打赏
  • 举报
回复
三位6进制数,忽略位顺序,各位和相同的为一组。最后将0~5对应1~6,和加3 ?
赵4老师 2013-07-04
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧