从1至N中找出所有不重复加在一起等于N的数组
2016-12-10 10:24
204 查看
输出不全
输出较全
#include<stdio.h> void prin(int n){ int i,j,a[100],num; for(i=n;i>n/2-1;i--){ j=i; num=n; while(1){ if(j<=0)break; if((num-j)>=0) num=num-j,printf("%d ",j); j--; } printf("\n"); } } int main() { int n; scanf("%d",&n); prin(n); }
输出较全
#include<stdio.h> void prin(int n,int a[],int t) { int i,j,m; //循环截止到n/2-1,因为小于n/2-1以后的数无论怎么加都不会大于等于n,故不必要做不必要的遍历,浪费时间 // for(i=n;i>n/2-1&&i>0; i--)下面的限制巧妙地控制了死循环,此处不必再对比i>0,浪费时间 for(i=n; i>n/2-1; i--) { if((n-i)>0) { a[t]=i; //其实这里应该是a[t]==a[t-1],避免出现相同的序列以及死循环(在上面的循环条件中加上i>0的限制也可避免,比如说传入的n为1时,将在0处无限循环),安全起见,防止a[t]越过a[t-1]直接大于a[t-1]的情况出现 if(a[t]>=a[t-1])return; prin(n-i,a,t+1); } else if((n-i)==0) { a[t]=i; if(t>0) if(a[t]>=a[t-1])continue;//避免出现相同的数 for(j=0; j<=t; j++) printf("%d ",a[j]); printf("\n"); } else { return; //减出负数了还不退出更待何时 } } } int main() { int a[1000],t=0; int n; scanf("%d",&n); prin(n,a,t); }
和为n连续正数序列
#include <stdio.h> typedef struct { int *stk; int top; int Size; } Stack; Stack* initstack(Stack *s,int n) { s=(Stack*)malloc(sizeof(Stack)); s->stk = (int*)malloc((s->Size=n)*sizeof(int)); s->top = 0; return s; } //输出栈s中的元素 void outputstack(Stack* s) { int i; if(stackempty(s))return; for(i=0; i<s->top; i++){ if(i==0) printf("%d",s->stk[i]); else printf(" %d",s->stk[i]); } printf("\n"); } //返回栈是否为空 int stackempty(Stack* s) { return !s->top; } //入栈 void push(Stack* s, int x) { s->stk[s->top++] = x; } void prin(int n) { Stack *l; int i,j,a[100],num; //从第一个开始遍历,找出从1~(n/2)至之后的连续序列,大于n/2之后随便两个数相加都大于n for(i=1; i<=n/2; i++) { j=i; num=n; l=initstack(l,30); //以i开头的一个初始栈 while(1) { if(num==0)break; //成功找出一组序列 if(j>n){ //如果j大于n,此组数据不成立,清空栈 l->top=0; break; } if((num-j)>=0) { push(l,j); num=num-j; } else //减出负数了,此组数据不成立,清空栈 { l->top=0; break; } j++; } outputstack(l); } } int main() { int n; scanf("%d",&n); prin(n); }
相关文章推荐
- 找出数组中所有重复的数
- 找出一个字符数组(元素不重复)所有可能字符的组合
- 从一个数组中找出几个数,使其相加等于某个值的算法(数组元素可以重复)
- (转载) 数组a[]={3,5,2,4,1,8},要求从a中找出所有“和”等于10的子集
- 循环一次,找出数组中存在的所有重复数
- 找出字符串数组中的等于某字符串的所有索引位置
- 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{
- 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3
- 在一个数组中,找出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它
- 数组中所有重复次数大于等于minTimes的数字
- 在一个长度为n的数组里的所有数字都在1到n-1的范围内。 有一个数字重复若干次,找出这个数字。
- 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{
- 递归列举从数组b()中选出某些元素(允许重复)使其和等于num的所有组合
- http://www.dewen.net.cn/q/15749/PHP求数组值相加(可重复)等于某值的所有组合
- 百度三面:找出数组中所有这样的数,大于等于左边的所有数,小于等于右边的所有的数
- 递归列举从数组b()中选出某些元素(允许重复)使其和等于num的所有组合
- 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
- 找出数组里大于等于左侧、小于等于右侧的所有数
- 找出数组中的唯一重复元素
- 找出有序整数数组中下标与值相同的所有元素