8枚硬币问题(减治法) c语言
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
j++;
}
j=0;
while(j<=1)
{c[j]=coin[j+6];j++;}
j=0;
while(j<=2)//两边数组求和
{
sum_b+=b[j];
j++;
}
j=0;
while(j<=2)
{
sum_a+=a[j];
j++;
}
if(sum_a!=sum_b)
{
sum_a=0;//a,b数组前两个数据相加比较大小
j++;
}
j=0;
sum_b=0;
while(j<2)
{
sum_b=b[j]+sum_b;
j++;
}
if(sum_a>sum_b)
flag_2=1;
else
flag_2=0;
if(flag_1==flag_2)
{
if(a[0]==a[1])
return 4;
else
return 1;
}
else
{
temp=a[1];
}
else
{
if(sum_a>sum_b)//flag标志交换数后两边数组和是否相等
flag_1=1;
else
flag_1=0;
temp=a[1];
a[1]=b[1];
b[1]=temp;
sum_a=0;//a,b数组前两个数据相加比较大小
j=0;
while(j<2)
{
sum_a=a[j]+sum_a;
j=0;
while(j<2)
{
sum_a=a[j]+sum_a;
j++;
}
j=0;
sum_b=0;
while(j<2)
{
sum_b=b[j]+sum_b;
j++;
}
if(sum_a==sum_b)//找到数据在所输入数据的第3,或6位置
{
if(a[0]==a[2])
return 6;
else
return 3;
int main(void)
{
int coin[N];
int i=0;
printf("8枚硬币问题,0代表假,1代表真,请输入8个0或1数字,并且只存在一个假硬币:\n");
while(i<8)
{scanf("%d",&coin[i]);i++;
}wenku.baidu.com
i=false_coin(coin);
printf("\n第%d个位置是假硬币",i);
实验项目——8枚硬币问题
1.实验题目
在8枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测出这枚假币。
2.实验目的
(1)深刻理解并掌握减治法的设计思想;
(2)提高应用减治法设计算法的技能;
(3)理解这样一个观点:建立正确的模型对于问题的求解时非常重要的。
a[1]=b[1];
b[1]=temp;
if(a[0]==a[1])
return 5;
else
return 2;
}
}
}
else
{
if(c[0]==a[0])
return 8;
else
return 7;
}
}
5.实验心得
从开学到现在第一次完整的运行出正确结果,以前运行都是错误结果!程序中发现自己基础语法不扎实,数组作为参数传递时使用错误,数组输入出问题,还有不会使用单步运行,程序写完后,不管输入怎么样的输出结果就永远是在第3这个位置停留。最后加入自己写的相应的代码后,可以发现程序中的变量问题出现在哪里,程序里面的问题终于被找到!
3.实验要求
(1)设计减治算法实现8枚硬币问题;
(2)设计实验程序,考察用减治技术的算法是否高效;
(3)扩展算法,使之能处理n枚硬币中有1枚假币的问题。
4.具体实现
(1)运行结果:
(2)具体程序实现:
#include<stdio.h>
#define N 8
int false_coin(int coin[]);
}
int false_coin(int coin[])
{
int a[N],b[N],c[N],temp;
int j=0,sum_a=0,sum_b=0,flag_1,flag_2;
while(j<=2)//把8个硬币分配成a,b,c分别为3,3,2
{
a[j]=coin[j];
b[j]=coin[j+3];
}
j=0;
while(j<=1)
{c[j]=coin[j+6];j++;}
j=0;
while(j<=2)//两边数组求和
{
sum_b+=b[j];
j++;
}
j=0;
while(j<=2)
{
sum_a+=a[j];
j++;
}
if(sum_a!=sum_b)
{
sum_a=0;//a,b数组前两个数据相加比较大小
j++;
}
j=0;
sum_b=0;
while(j<2)
{
sum_b=b[j]+sum_b;
j++;
}
if(sum_a>sum_b)
flag_2=1;
else
flag_2=0;
if(flag_1==flag_2)
{
if(a[0]==a[1])
return 4;
else
return 1;
}
else
{
temp=a[1];
}
else
{
if(sum_a>sum_b)//flag标志交换数后两边数组和是否相等
flag_1=1;
else
flag_1=0;
temp=a[1];
a[1]=b[1];
b[1]=temp;
sum_a=0;//a,b数组前两个数据相加比较大小
j=0;
while(j<2)
{
sum_a=a[j]+sum_a;
j=0;
while(j<2)
{
sum_a=a[j]+sum_a;
j++;
}
j=0;
sum_b=0;
while(j<2)
{
sum_b=b[j]+sum_b;
j++;
}
if(sum_a==sum_b)//找到数据在所输入数据的第3,或6位置
{
if(a[0]==a[2])
return 6;
else
return 3;
int main(void)
{
int coin[N];
int i=0;
printf("8枚硬币问题,0代表假,1代表真,请输入8个0或1数字,并且只存在一个假硬币:\n");
while(i<8)
{scanf("%d",&coin[i]);i++;
}wenku.baidu.com
i=false_coin(coin);
printf("\n第%d个位置是假硬币",i);
实验项目——8枚硬币问题
1.实验题目
在8枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测出这枚假币。
2.实验目的
(1)深刻理解并掌握减治法的设计思想;
(2)提高应用减治法设计算法的技能;
(3)理解这样一个观点:建立正确的模型对于问题的求解时非常重要的。
a[1]=b[1];
b[1]=temp;
if(a[0]==a[1])
return 5;
else
return 2;
}
}
}
else
{
if(c[0]==a[0])
return 8;
else
return 7;
}
}
5.实验心得
从开学到现在第一次完整的运行出正确结果,以前运行都是错误结果!程序中发现自己基础语法不扎实,数组作为参数传递时使用错误,数组输入出问题,还有不会使用单步运行,程序写完后,不管输入怎么样的输出结果就永远是在第3这个位置停留。最后加入自己写的相应的代码后,可以发现程序中的变量问题出现在哪里,程序里面的问题终于被找到!
3.实验要求
(1)设计减治算法实现8枚硬币问题;
(2)设计实验程序,考察用减治技术的算法是否高效;
(3)扩展算法,使之能处理n枚硬币中有1枚假币的问题。
4.具体实现
(1)运行结果:
(2)具体程序实现:
#include<stdio.h>
#define N 8
int false_coin(int coin[]);
}
int false_coin(int coin[])
{
int a[N],b[N],c[N],temp;
int j=0,sum_a=0,sum_b=0,flag_1,flag_2;
while(j<=2)//把8个硬币分配成a,b,c分别为3,3,2
{
a[j]=coin[j];
b[j]=coin[j+3];