假币算法求解(三分算法和二分算法)
来源:互联网 发布:c 书籍推荐 知乎 编辑:程序博客网 时间:2024/06/04 18:44
//**********************************************
//
// 假币算法求解(三分算法和二分算法)
// xwlee 2006/12/20
//**********************************************
#include<iostream>
#include<cmath>
#include <ctime>
#include <iomanip>
using namespace std;
int find2(int coin[], int low, int high);//二分算法
int find3(int coin[], int low, int high);//三分算法
int main(void)
{
int i, *coin,n,temp;
cout<<"请输入硬币的个数(n最大为机器整数值):";
cin>>n;
srand( (unsigned)time( NULL ) );//srand()函数产生一个以当前时间开始的随机种子
cout<<"正在随机产生数据(用0和1分别代表假币和真币).../n/n";
coin=new int[n+1];//多产生一个位置,用coin[0]来记录本次调用称重的次数
temp=1+rand()%n;//随机产生1~n之间的一个数
coin[0]=0;//计数器
for(i=1; i<n+1; ++i)
i!=temp ? coin[i]=1 : coin[i]=0;
for(i=1; i<n+1; ++i)
if(i!=temp)
cout<<"第"<<setw(3)<<i<<" 枚硬币是真币(1)"<<endl;
else
cout<<"第"<<setw(3)<<i<<" 枚硬币是假币(0)"<<endl;
cout<<endl<<endl<<"假币二分算法结果:"<<endl;
cout<<"假币在第"<<setw(3)<<find2(coin,1,n)<<"个位置!"<<endl;
cout<<"总共称的次数为"<<setw(3)<<coin[0]<<"次!"<<endl;
cout<<endl<<endl<<"假币三分算法结果:"<<endl;
cout<<"假币在第"<<setw(3)<<find3(coin,1,n)<<"个位置!"<<endl;
cout<<"总共称的次数为"<<setw(3)<<coin[0]<<"次!"<<endl<<endl<<endl;
return 0;
}
int find2(int coin[], int low, int high)
{
int i,mid,sum1,sum2,sign;
coin[0]=0;
do //下界和上界所指示的初始位置
{
mid=(low+high)/2;
sign= (low+high)%2;//标记奇数和偶数
//cout<<sign<<endl;
sum1=sum2=0;
if(sign==0)//处理奇数的情况
{
for(i=low; i<mid; i++)
sum1 += coin[i];
for(i=mid+1; i<=high; i++)
sum2 += coin[i];
if( sum1==0 && sum2==0 )
;
else
coin[0] += 1;
if(sum1==sum2)
return mid;
else if(sum1<sum2)
{
high=mid-1;
}
else
{
low=mid+1;
}
}
else//处理偶数的情况
{
for(i=low; i<=mid; i++)
sum1 += coin[i];
for(i=mid+1; i<=high; i++)
sum2 += coin[i];
if( sum1==0 && sum2==0 )
;
else
coin[0] += 1;
if(sum1<sum2)
high=mid;
else
low=mid+1;
}
}while(1);//end while
return -1;
}
int find3(int coin[], int low, int high)
{
int i,mid1,mid2,sum1,sum2,sum3,flag,my_space;
coin[0]=0;
if(high<3)
{cout<<"您必须键入的个数要大于3"<<endl<<endl<<endl; exit(1);}
while(low<=high) //下界和上界所指示的初始位置
{
sum1=sum2=sum3=0;
my_space=(high-low+1)/3;
mid1=low+my_space-1;
mid2=mid1+my_space;
flag= (high-low+1) % 3;//标记被3除的余数,分别是余数为0,1,2
for(i=low; i<=mid1; i++)
sum1 += coin[i];
for(i=mid1+1; i<=mid2; i++)
sum2 += coin[i];
for(i=mid2+1; i<=mid2+my_space; i++) //注意这里
sum3 += coin[i];
if( sum1==0 && sum2==0 && sum3==0 )
;
else
coin[0] += 1;
if(flag==0)//处理余数为0的情况
{
if(sum1==sum2)
low=mid2+1;
if(sum1==sum3)
{ low=mid1+1; high=mid2; }
if(sum2==sum3)
high=mid1;
}
else if(flag==1)////处理余数为1的情况
{
if( sum1==sum2)
{
if(sum1==sum3)
{ return high;}
else
{low=mid2+1; high=high-1;}
}
else
{
if(sum1==sum3)
{ low=mid1+1; high=mid2;}
if(sum2==sum3)
{ high=mid1; }
}
}
else////处理余数为2的情况
{
if( sum1==sum2)
{
if(sum1==sum3)
{
coin[0] += 1;
if(coin[high-1]==0)
return high-1;
else
return high;
}
else
{low=mid2+1; high=high-2;}
}
else
{
if(sum1==sum3)
{ low=mid1+1; high=mid2;}
if(sum2==sum3)
{ high=mid1; }
}
}
//coin[0] += 1;
}//end while
return -1;
}
//
// 假币算法求解(三分算法和二分算法)
// xwlee 2006/12/20
//**********************************************
#include<iostream>
#include<cmath>
#include <ctime>
#include <iomanip>
using namespace std;
int find2(int coin[], int low, int high);//二分算法
int find3(int coin[], int low, int high);//三分算法
int main(void)
{
int i, *coin,n,temp;
cout<<"请输入硬币的个数(n最大为机器整数值):";
cin>>n;
srand( (unsigned)time( NULL ) );//srand()函数产生一个以当前时间开始的随机种子
cout<<"正在随机产生数据(用0和1分别代表假币和真币).../n/n";
coin=new int[n+1];//多产生一个位置,用coin[0]来记录本次调用称重的次数
temp=1+rand()%n;//随机产生1~n之间的一个数
coin[0]=0;//计数器
for(i=1; i<n+1; ++i)
i!=temp ? coin[i]=1 : coin[i]=0;
for(i=1; i<n+1; ++i)
if(i!=temp)
cout<<"第"<<setw(3)<<i<<" 枚硬币是真币(1)"<<endl;
else
cout<<"第"<<setw(3)<<i<<" 枚硬币是假币(0)"<<endl;
cout<<endl<<endl<<"假币二分算法结果:"<<endl;
cout<<"假币在第"<<setw(3)<<find2(coin,1,n)<<"个位置!"<<endl;
cout<<"总共称的次数为"<<setw(3)<<coin[0]<<"次!"<<endl;
cout<<endl<<endl<<"假币三分算法结果:"<<endl;
cout<<"假币在第"<<setw(3)<<find3(coin,1,n)<<"个位置!"<<endl;
cout<<"总共称的次数为"<<setw(3)<<coin[0]<<"次!"<<endl<<endl<<endl;
return 0;
}
int find2(int coin[], int low, int high)
{
int i,mid,sum1,sum2,sign;
coin[0]=0;
do //下界和上界所指示的初始位置
{
mid=(low+high)/2;
sign= (low+high)%2;//标记奇数和偶数
//cout<<sign<<endl;
sum1=sum2=0;
if(sign==0)//处理奇数的情况
{
for(i=low; i<mid; i++)
sum1 += coin[i];
for(i=mid+1; i<=high; i++)
sum2 += coin[i];
if( sum1==0 && sum2==0 )
;
else
coin[0] += 1;
if(sum1==sum2)
return mid;
else if(sum1<sum2)
{
high=mid-1;
}
else
{
low=mid+1;
}
}
else//处理偶数的情况
{
for(i=low; i<=mid; i++)
sum1 += coin[i];
for(i=mid+1; i<=high; i++)
sum2 += coin[i];
if( sum1==0 && sum2==0 )
;
else
coin[0] += 1;
if(sum1<sum2)
high=mid;
else
low=mid+1;
}
}while(1);//end while
return -1;
}
int find3(int coin[], int low, int high)
{
int i,mid1,mid2,sum1,sum2,sum3,flag,my_space;
coin[0]=0;
if(high<3)
{cout<<"您必须键入的个数要大于3"<<endl<<endl<<endl; exit(1);}
while(low<=high) //下界和上界所指示的初始位置
{
sum1=sum2=sum3=0;
my_space=(high-low+1)/3;
mid1=low+my_space-1;
mid2=mid1+my_space;
flag= (high-low+1) % 3;//标记被3除的余数,分别是余数为0,1,2
for(i=low; i<=mid1; i++)
sum1 += coin[i];
for(i=mid1+1; i<=mid2; i++)
sum2 += coin[i];
for(i=mid2+1; i<=mid2+my_space; i++) //注意这里
sum3 += coin[i];
if( sum1==0 && sum2==0 && sum3==0 )
;
else
coin[0] += 1;
if(flag==0)//处理余数为0的情况
{
if(sum1==sum2)
low=mid2+1;
if(sum1==sum3)
{ low=mid1+1; high=mid2; }
if(sum2==sum3)
high=mid1;
}
else if(flag==1)////处理余数为1的情况
{
if( sum1==sum2)
{
if(sum1==sum3)
{ return high;}
else
{low=mid2+1; high=high-1;}
}
else
{
if(sum1==sum3)
{ low=mid1+1; high=mid2;}
if(sum2==sum3)
{ high=mid1; }
}
}
else////处理余数为2的情况
{
if( sum1==sum2)
{
if(sum1==sum3)
{
coin[0] += 1;
if(coin[high-1]==0)
return high-1;
else
return high;
}
else
{low=mid2+1; high=high-2;}
}
else
{
if(sum1==sum3)
{ low=mid1+1; high=mid2;}
if(sum2==sum3)
{ high=mid1; }
}
}
//coin[0] += 1;
}//end while
return -1;
}
- 假币算法求解(三分算法和二分算法)
- 算法笔记--二分/三分
- 二分、三分查找算法模板
- 二分三分算法专项训练
- 三分算法及利用三分算法求解二次函数问题
- 三分算法
- 三分算法
- 三分算法
- 三分算法
- 三分算法
- 三分算法
- 三分算法
- 找假币算法
- 算法学习-天平与假币
- 学习匈牙利算法总结(求解二分图最大匹配)
- 二分图性质以及求解算法
- 算法训练 一元三次方程求解 二分
- 三分搜索算法
- Tomcat启动分析
- 数组在状态传递中的作用
- 结构体和联合体在数据处理中的妙用
- python学习——第四天
- 最新李嘉诚访谈录
- 假币算法求解(三分算法和二分算法)
- 电话帐单交款算法
- 获得网卡MAC地址和IP地址(VB.net)
- 谁来知道一下我的485通信啊?
- ASP.NET(c#)运用API函数获取系统信息
- 如何发布 ClickOnce 应用程序
- c#将指定数据库中所有数据由简体转换为繁体
- 关于spring 乱码经验
- Intel PXA27x平台中的UART接口驱动 (摘录曾慧鹏)