100分求两个简单的算法,希望大家多多帮忙,解决立结!

wunifeng 2005-01-27 05:11:58
希望各位把代码贴出来,这样便于交流,谢谢!

一、有九个环,每个环有“上”、“下”两种状态,记为:“∧”和“∨”。开始时九个环均为“上”态,即:∧9∧8∧7∧6∧5∧4∧3∧2∧1。假设我们要改变第i个环的状态(∧i -> ∨i或者∨i ->∧i),则必须满足 ∧i-1∨i-2...∨1 。即只有第i-1环为上态,其他在它前面的环(1->i-2)均为下态,才能够改变i环的状态。现需要将九个均为“上”态的环,改为九个均为“下”态,问至少需要多少步操作(在条件许可下改变任何一个环的状态称为一步)?

二、任给四个不同的正整数,每个正整数最多使用1次,请问这四个正整数能够加和的结果共有多少种,同时请按以下格式列出每种有多少个分布以及不分先后次序的实例。
例如,对于1,2,3,4四个数,输出如下:
加和的结果共有10种,分别是:
1有1种分布:
1 = 1
10有1种分布:
10 = 1 + 2 + 3 + 4
6有2种分布:
6 = 1 + 2 + 3
6 = 2 + 4
....
并且用C/C++或者Pascal语言实现。
...全文
330 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
ybt631 2005-01-28
  • 打赏
  • 举报
回复
第二题就是回搠设计递归求集合的冥集的过程,不过要去掉空集的情况
程序如下:
#include <iostream.h>
#include <stdlib.h>
void GetPowerSet(int i,int a[],int b[],int n)
{
//功能:求以数组a[i,..,n-1]中元素为集合中元素的集合的冥集
//在对字符串中元素进行运算时要注意字符串的结束符'\0'也算是集合中的元素
//具体处理的方法见上例
int j;
int sum=0,flag=0;
if(i==n)
{
for(j=0;j<n;j++)
if(b[j]!=0)
{flag=1;sum+=b[j];}
if(flag==1) //避免对空集的情况进行输出
{
cout<<sum<<"=";
for(j=0;j<n;j++)
if(b[j]!=0)
{cout<<b[j];break;}
for(j=j+1;j<n;j++)
if(b[j]!=0)
{cout<<"+"<<b[j];}
cout<<endl;
}
}
else
{
b[i]=a[i];
GetPowerSet(i+1,a,b,n);
b[i]=0; //b[i]所重新赋的值必须是a中不曾出现的元素
GetPowerSet(i+1,a,b,n);
}
}

#define N 4
main()
{
int j,i=0;
int b[N];
int a[N]={1,2,3,4};
/*
for(j=i;j<N;j++)
cin>>a[j]; //进行输入*/
GetPowerSet(i,a,b,N);
system("pause");
}
rorl 2005-01-28
  • 打赏
  • 举报
回复
数学题
dongpy 2005-01-28
  • 打赏
  • 举报
回复
第一题:递归法
#include "stdio.h"
#include "stdlib.h"
#define UP 0
#define DOWN 1
int times; //记录操作次数
int *sign; //记录环的当前状态
void Turn(int k)
{
if(k!=0)
{
if(sign[k-1] == DOWN)
Turn(k-1);
for(int i=k-2;i>=0;--i)
{
if(sign[i] == UP)
Turn(i);
}
}
++times;
printf("[%d]:%d->",k+1,sign[k]); //输出操作过程([环号]:状态1->状态2)
sign[k]=(sign[k] == UP)?DOWN:UP;
printf("%d\t",sign[k]);
}

int main()
{
int Num,i;
printf("输入环数:");
scanf("%d",&Num);
times = 0;
sign = (int*)malloc(Num*sizeof(int));
for(i=0;i<Num;++i)
sign[i] = UP;
for(i = Num-1;i>=0;--i)
Turn(i);
printf("\n操作次数:%d\n",times);
free(sign);
return 0;
}
Num=1...4的情况已经测试过.
Num = 9时, times = 341
dongpy 2005-01-28
  • 打赏
  • 举报
回复
第一题:递归法
#include "stdio.h"
#include "stdlib.h"
#define UP 0
#define DOWN 1
int times; //记录操作次数
int *sign; //记录环的当前状态
void Turn(int k)
{
if(k!=0)
{
if(sign[k-1] == DOWN)
Turn(k-1);
for(int i=k-2;i>=0;--i)
{
if(sign[i] == UP)
Turn(i);
}
}
++times;
printf("[%d]:%d->",k+1,sign[k]); //输出操作过程([环号]:状态1->状态2)
sign[k]=(sign[k] == UP)?DOWN:UP;
printf("%d\t",sign[k]);
}

int main()
{
int Num,i;
printf("输入环数:");
scanf("%d",&Num);
times = 0;
sign = (int*)malloc(Num*sizeof(int));
for(i=0;i<Num;++i)
sign[i] = UP;
for(i = Num-1;i>=0;--i)
Turn(i);
printf("\n操作次数:%d\n",times);
free(sign);
return 0;
}
Num=1...4的情况已经测试过.
Num = 9时, times = 341
dongpy 2005-01-28
  • 打赏
  • 举报
回复
经过测试:N(环数),T(操作次数)
N =1 , T=1;
N =2 , T=2;
N =3 , T=5;
N =4 , T=10;
显然不到2^N-1这么多!

wunifeng 2005-01-28
  • 打赏
  • 举报
回复
能不能再等等,看看有没有达人来贴出第一题的源码?
好了,等到中午13:30再结贴


to kunun() :请注意这个条件:
假设我们要改变第i个环的状态(∧i -> ∨i或者∨i ->∧i),则必须满足 ∧i-1∨i-2...∨1 。即只有第i-1环为上态,其他在它前面的环(1->i-2)均为下态,才能够改变i环的状态。

dongpy 2005-01-28
  • 打赏
  • 举报
回复
第一题:9个环,操作次数:341
操作i环时,不需要对i-1.....1都操作,因为有些可能已经满足要求
dongpy 2005-01-28
  • 打赏
  • 举报
回复
第一题用不着那么多次数
wunifeng 2005-01-28
  • 打赏
  • 举报
回复
呵呵,多谢各位!现在结贴。
xuelong_zl 2005-01-28
  • 打赏
  • 举报
回复
mark
wunifeng 2005-01-28
  • 打赏
  • 举报
回复
liem(阿明) 兄,不好意思,本来打算给你一半的,但是其他几个兄弟就比较难分了。

如果哪位兄弟觉得不公平,给我消息,我另外开贴放分。再一次多谢各位了^_^
wunifeng 2005-01-28
  • 打赏
  • 举报
回复
hehe,谢谢 dongpy(51-->ARM) 。

结贴啦
5204711353 2005-01-27
  • 打赏
  • 举报
回复
int Num[4]; /* 输入的四个数 */
int Resoult[15]; /* C(1,4) + C(2,4) + C(3,4) + C(4,4)最多15种组合结果 */
int total=0; /* 一共有几种结果 */
void Input(); /* 输入 */
void End(); /* 结束 */
void PrintNum();
void SortNum(); /* 对输入的四个数排序 */
void Stat(int point,int sum,int curr_count,int count); /* 统计一共有几种组合结果 */
/* 显示每种结果的组合情况 */
void combin(int point,int sum,int target,int array[],int pot);
main()
{int count,point,array[4];

Input();
SortNum();
for(count=1;count<=4;count++) /* 递归寻找所有组合结果 */
for(point=0;point<=4-count;point++)
Stat(point,0,0,count);
for(count=0;count<total;count++) { /* 显示结果 */
printf("way of %d\n",Resoult[count]);
for(point=0;point<=3;point++)
combin(point,0,Resoult[count],array,0);
}
End();
}
void combin(int point,int sum,int target,int array[],int pot)
{int i;
if(point==4)
return;
sum=sum+Num[point];
array[pot]=Num[point];
pot++;
if(sum>target)
return;
else if(sum==target) { /*显示结果*/
for(i=0;i<pot;i++)
printf("%d ",array[i]);
printf("\n");
}
else
for(i=point+1;i<4;i++)
combin(i,sum,target,array,pot);
}

void Stat(int point,int sum,int curr_count,int count)
{int i;
if(point==4)
return;
sum=sum+Num[point];
curr_count++;
if(curr_count != count) { /* 继续递归累加 */
for(i = point+1 ;i < 4; i++)
Stat(i,sum,curr_count,count);
}
else { /* 判断是否添加新的可能结果 */
if(total==0) {
Resoult[total]=sum;
total++;
}
else {
for(i=0;i<total;i++)
if(Resoult[i]==sum)
break;
if(i>=total) {
Resoult[total]=sum;
total++;
}
}
}
}
void Input()
{
int i;
for(i = 0;i < 4;i++)
scanf("%d" , &Num[i]);
}
void SortNum()
{
int i,j,t;
for(i = 0;i < 3;i++)
for(j = i+1;j < 4;j++)
if(Num[j] < Num[i]) {
t = Num[i];
Num[i] = Num[j];
Num[j] = t;
}
}
void End()
{
getch();
}
5204711353 2005-01-27
  • 打赏
  • 举报
回复
这个才是~上面的那个是求一个集合的冥集
#include <iostream.h>
int b[100];
int i;
void fun(int k,int *p)
{
int m=0;
if(k==i)
{
for(int l=0;l<k;l++)
if(b[l]!=0)
{
m=m+b[l];
}
if(m!=0)
cout<<m;
cout<<endl;

}
else
{

b[k]=p[k];
fun(k+1,p);
b[k]=0;
fun(k+1,p);
}
}
int main()
{
cout<<"请问你要输入几个数字\n";

cin>>i;
cout<<endl;
int *p=new int[i];
for(int j=0;j<i;j++)
cin>>p[j];
cout<<endl;
fun(0,p);
return 0;
}
5204711353 2005-01-27
  • 打赏
  • 举报
回复
第2道题目原代码在下面

#include <iostream.h>
int b[100]={0};
int i;
void fun(int k,int *p)
{
int m=0;
if(k==i)
{
for(int l=0;l<k;l++)
if(b[l]!=0)
{
cout<<b[l];

m++;
}
cout<<endl;
if(m==0)
cout<<"{ }";
}
else
{

b[k]=p[k];
fun(k+1,p);
b[k]=0;
fun(k+1,p);
}
}
int main()
{
cout<<"请问你要输入几个数字\n";

cin>>i;
cout<<endl;
int *p=new int[i];
for(int j=0;j<i;j++)
cin>>p[j];
fun(0,p);
delete [] p;
return 0;
}
kunun 2005-01-27
  • 打赏
  • 举报
回复
哦,000000000,o00000000,oo0000000,ooo000000,oooo00000,ooooo0000,oooooo000,ooooooo00
oooooooo0,ooooooooo,这样理解对吗?
wunifeng 2005-01-27
  • 打赏
  • 举报
回复
to kunun() :
兄弟是没有看清楚题目吧,呵呵,再把题目好好看看
kunun 2005-01-27
  • 打赏
  • 举报
回复
新手有点不明白,全上态时,从9 -> 1变下去,不是9步就行了吗?
哪里看错了吗?
wunifeng 2005-01-27
  • 打赏
  • 举报
回复
to liem(阿明) :
多谢兄弟了,呵呵先说明,至少有一半分是兄弟你的了。

to weigoal(战神) :
这是一个朋友碰到的面试题,不是我碰到的,他不想做,我这两天也忙着,所以拿上来让大家帮帮忙。


谢谢大家了!
ahwang 2005-01-27
  • 打赏
  • 举报
回复
好复杂的一个问题啊
加载更多回复(6)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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