| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1620 人关注过本帖
标题:想写一个简单的程序,但是不知道该怎么写,请教高手应该怎么循环。
只看楼主 加入收藏
gaoshuai369
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2016-11-14
结帖率:0
收藏
 问题点数:0 回复次数:6 
想写一个简单的程序,但是不知道该怎么写,请教高手应该怎么循环。
有一个16位数的数组{1,2,4,5,7,8,12,14,15,17,18,21,24,25,27,28},,打印出任意七位相加等于100的元素
程序代码:
main()
{int a,b[16]={1,2,4,5,7,8,12,14,15,17,18,21,24,25,27,28}
for(a=0;a<=10;a++)
if(b[a]+b[a+1]+b[a+2]+b[a+3]+b[a+4]+b[a+5]+b[a+6]==100)
printf("b[a]=%d,b[a+1]=%d,b[a+2]=%d,b[a+3]=%d,b[a+4]=%d,b[a+5]=%d,b[a+6]=%d\n",b[a],b[a+1],b[a+2],b[a+3],b[a+4],b[a+5],b[a+6]);}

我这样循环应该是不对的,请教高手应该怎么搞呢。
搜索更多相关主题的帖子: 元素 
2016-11-17 23:59
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
这就是16选7的排列组合问题~16选7有点大,但我可以给一个思路你~
1:设计7个元素a0a1a2a3a4a5a6分别对应原数组0123456的位置,
2:6往后移动到到b15;
3:a5进一,a6回到a5的前一位
4:a6再次移动到b15,a5进一;
5:------直到a5移动到b14(此时a6在b15)
6:a4进一,a5在a4的前面,a5在a6的前面
7----(慢慢理解)重复上述过程,直到a5a6分别在b14,b15,此时a4进1
8----(重复上述过程)直到-------
9----直到a0在b9的位置---
10----当然,如果中途有满足a0+a1+a2+a3+a4+a5+a6=100的,则分别输出此时a0a1a2a3a4a5a6的值
以下有一个关于排列组合的代码,但只考虑排列方面(就是说连a里面的元素排位也考虑进去了,步骤比单纯组合多很多)
为了简便(那个代码虽然也能算,但是加上位置排列步骤太多了~为了简便,便来了个10选5=60的,希望对你有所帮助)
(其实排列算法比组合还要复杂一些,但排列通用性强于组合)
程序代码:
#include<stdio.h>
#define N 10
void begin();//初始化处理
void change(int []);//操作函数
void number(int [],int);//排序函数
void swap(int *,int *);//交换函数
void print(int []);//输出函数

void begin()
{
    int a[N]={1,2,4,5,8,12,13,16,18,28};
    printf("\n");
    number(a,0);//对输入数进行排序
    change(a);//执行操作
}
void change(int a[])
{
    int i,k1,k2,sum;
    for (i=k1=0;i<N-1;i++)
    if (a[i]<a[i+1])
        k1=i+1;//a[k1]为右端数的最大值
    for (i=5;i<10;i++)
        sum+=a[i];
    if (sum==60)
    {
        printf("找到满足要求的数,数据如下:\n");
        for (i=5;i<10;i++)
            printf("%4d",a[i]);
            printf("\n");
            return;
    }
    if (!k1)
    {
        printf("没能满足要求");
        return;
    }
    for (k2=k1;k2<N-1;k2++)
       if (a[k1-1]<=a[k2]&&a[k1-1]>=a[k2+1])
           break;//k2为交换数据的关键值
    swap(&a[k1-1],&a[k2]);//交换数值
    number(a,k1);
    return (change(a));
}
void swap(int *a,int *b)//交换两数值的函数
{    
    int t;
    t=*a;
    *a=*b;
    *b=t;
}
void number(int a[],int k1)//排序函数
{
    int i,j,u;
    for (i=k1,u=0;i<N;i++,u++)
        for (j=k1;j<N-1-u;j++)
            if (a[j]>a[j+1])
                swap(&a[j],&a[j+1]);//交换数值
}
void print(int a[])
{
    int i;
    for (i=0;i<N;i++)
        printf("%d ",a[i]);
    printf("\n");
}
int main()
{
    begin();
    return 0;
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-18 01:46
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
回复 楼主 gaoshuai369
#include<stdio.h>
int a,b[16]={1,2,4,5,7,8,12,14,15,17,18,21,24,25,27,28};
int judge[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int sum=0;
int result(int*s,int used)
{
    int i;
    if(used==7)
    {
        if(*s==100) return 1;
        else return 0;
    }
    for(i=0;i<16;i++)
    {
        if(!judge[i])
        {
            *s+=b[i];judge[i]=1;
            if(result(s,used+1)) return 1;
            else
            {
                *s-=b[i];judge[i]=0;
            }
        }
    }
    return 0;
}
int main()
{
    int idx;
    if(result(&sum,0))
    {
        for(idx=0;idx<16;idx++)
            if(judge[idx])
                printf("%d,",b[idx]);
        printf("\n");
    }
    return 0;
}
2016-11-18 10:43
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
你这题结果共有224种可能~
程序代码:
/*
    排列组合问题~
*/

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(Node)
#define SSS 16//1,2,4,5,7,8,12,14,15,17,18,21,24,25,27,28读取数据个数
#define M 7//组合个数
#define SUM 100//满足要求的值
int count=0;//计算用
typedef struct Node//声明双向链表
{
    int num;
    struct Node *next;
    struct Node *back;
}Node;
Node *head=NULL;
Node *p[M];//声明结构体指针数组
void creat()//创建链表
{
    Node *p1,*p2;
    int i=0,n=SSS;
    p1=p2=(Node*)malloc(LEN);
    p1->back=NULL;
    scanf("%d",&p1->num);
    while (--n)
    {
        if (n==SSS-1)
            head=p1;
        else
            {
                p2->next=p1;
                p1->back=p2;
            }
        p2=p1;
        p1=(Node*)malloc(LEN);
        scanf("%d",&p1->num);
    }
    p2->next=p1;
    p1->back=p2;
    p1->next=NULL;
    p[i]=head;
    while (i<M-1)//读入结构体指针数组元素的位置
        {
            p[i+1]=p[i]->next;
            i++;
        }
}
/*void print()----------原意是输出整个双向链表数据,但这题不需要用
{
    Node *p=head;
    while (p)
    {
        printf("%d ",p->num);
        p=p->next;
    }
    printf("\n");
}*/
void print_p()//输出结构体指针数组的数据
{
    int i;
    for (i=0;i<M;i++)
        printf("%d ",p[i]->num);
    printf("\n");
}
void judge()//判断是否满足条件
{
    int i,sum;
    for (i=sum=0;i<M;i++)
        sum+=p[i]->num;
    if (sum==SUM)
    {
        count++;
        print_p();
    }
}
void fun_1()//主体执行函数
{
    judge();//判断
    while(p[M-1]->next!=NULL)
    {
        p[M-1]=p[M-1]->next;
        judge();
    }
}
int fun_2()//执行主体函数后的后续处理函数
{
    int i=1;
    while (p[M-i]->back==p[M-i-1])
        {
            i++;
            if (i==M)
                return 0;
        }
        p[M-i-1]=p[M-i-1]->next;
     while (i)
    {
        p[M-i]=p[M-i-1]->next;
        i--;
    }
    return 1;
}
int main()
{
    creat();
    printf("\n结果如下\n");
//    print();
    do
    {
        fun_1();
    }while(fun_2());
    printf("共有%d种满足要求的组合\n",count);
    return 0;
}


[此贴子已经被作者于2016-11-18 15:41编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-18 13:31
gaoshuai369
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2016-11-14
收藏
得分:0 
回复 3楼 yangfrancis
拜谢了,高人
2016-11-18 21:37
gaoshuai369
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2016-11-14
收藏
得分:0 
回复 3楼 yangfrancis
拜谢了,高人
2016-11-18 21:38
gaoshuai369
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2016-11-14
收藏
得分:0 
回复 4楼 九转星河
拜谢了,高人
2016-11-18 21:39
快速回复:想写一个简单的程序,但是不知道该怎么写,请教高手应该怎么循环。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024850 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved