118.求满足特异条件的数列

简介: 118.求满足特异条件的数列
#include<stdio.h>
#define NUM 10      /*允许分解的最大元素数量*/
int i[NUM];        /*记录分解出的数值的数组*/
void main()
{
   int sum,n,total,k,flag,count=0;
   clrscr();
   puts("*********************************************************");
   puts("*   This is a program to get number sequence with       *");
   puts("* special characteristic. Input n and m,get the sequence*");
   puts("* S1,S2,...,Sn, where S1+S2+...+Sn=m and S1>=S2>=...>=Sn*");
   puts("* e.g.n=4,m=8,S: 5 1 1 1,4 2 1 1,3 3 1 1,3 2 2 1,2 2 2 2*");
   puts("*********************************************************");
   printf(" >> Input element number of the sequence (n<=10): ");
   scanf("%d",&n);
   printf(" >> Input the sum of the elements (m<=20): ");
   scanf("%d",&total);
   sum=0;                 /*当前从后向前k个元素的和*/
   k=n;                   /*从后向前正在处理的元素下标*/
   i[n]=1;             /*将最后一个元素的值置为1作为初始值*/
   printf(" >> Possible sequences are as follows:\n");
   while(1)
   {
      if(sum+i[k]<total)     /*若后k位的和小于指定的total*/
         if(k<=1)            /*若正要处理的是第一个元素*/
         {i[1]=total-sum;flag=1;}     /*则计算第一个元素的并置标记*/
         else{
            sum+=i[k--];
            i[k]=i[k+1];        /*置第k位的值后k-1*/
            continue;         /*继续向前处理其它元素*/
         }
      else if(sum+i[k]>total||k!=1)   /*若和已超过total或不是第一个元素*/
         { sum-=i[++k]; flag=0;}      /*k向后回退一个元素*/
      else flag=1;        /*sum+i[k]=total&&k=1 则设置flag标记*/
      if(flag)
      {
         printf(" No.%2d: ",++count);
         for(flag=1;flag<=n;++flag)
            printf("%d ",i[flag]);
         printf("\n");
      }
      if(++k>n)     /*k向后回退一个元素后判断是否已退出最后一个元素*/
         break;
      sum-=i[k];
      i[k]++;        /*试验下一个分解*/
   }
   printf("\n Press any key to quit...");
   getch();
}
相关文章
|
7天前
|
存储 C语言 Python
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
48 4
|
4月前
|
C++
给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
|
5月前
|
机器学习/深度学习 算法 测试技术
【排序 贪心】3107. 使数组中位数等于 K 的最少操作数
【排序 贪心】3107. 使数组中位数等于 K 的最少操作数
【排序 贪心】3107. 使数组中位数等于 K 的最少操作数
|
5月前
|
算法 测试技术 C++
【位运算 贪心】2835. 使子序列的和等于目标的最少操作次数
【位运算 贪心】2835. 使子序列的和等于目标的最少操作次数
【位运算 贪心】2835. 使子序列的和等于目标的最少操作次数
|
5月前
334.递增的三元子序列
334.递增的三元子序列
26 0
LeetCode-334 递增的三元子序列
LeetCode-334 递增的三元子序列
|
5月前
leetcode-334:递增的三元子序列
leetcode-334:递增的三元子序列
31 0
|
5月前
|
Python
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3,
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3,
|
10月前
|
算法 测试技术 C#
C++二分算法:得到子序列的最少操作次数
C++二分算法:得到子序列的最少操作次数
每日三题-组合总和、全排列、括号生成
每日三题 组合总和 全排列 括号生成
79 0
每日三题-组合总和、全排列、括号生成