33,311
社区成员
发帖
与我相关
我的任务
分享
#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;
}
//有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
if (strIn[n]<'6')//找到那個小於'6'的數
{
strIn[n]++;
for (int i = n;i<COUNT;i++)
{
strIn[i] = strIn[n];//這個是組合
//strIn[i] = '1';//這個就是排列了
}
return 0;
}
#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;
}
#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);
}
}