int stone[255]; //0石子堆数,其他对应一堆石子的个数
char filePath[100];
int stoneNum = 0;
//
//从c:\1.txt读取石子堆数,和每一堆石子的个数
void Init()
{
char temp;
FILE *fp;
char bl = 0 ;
printf("open file and read data\n");
if( NULL == (fp = fopen(filePath,"rt")))
{
printf("open file is error\n");
exit(0);
}
while(!feof(fp))
{
temp = getc(fp);
//是数字的ascii,将其转ascii转换成数字,
if('0' <= temp &&'9' >= temp )
{
stone[stoneNum] = stone[stoneNum]*10 + temp - '0';
bl = 1;
}
else
{
//有数字编程空格的时候表示要读下一个数字,所有stoneNum++
if(1 == bl)
{
stoneNum++;
bl = 0;
}
}
}
stoneNum -- ;//本身记录的是所有读出数字的个数。因为第一个是总堆数 所以减去一个是堆数
//看看数据是不是正确 给出的总堆数 是不是和读出的堆数相同
if(stoneNum != stone[0] || 0 == stoneNum)
{
printf("input data is error !\n");
exit(0);
}
printf("read data finish\n");
}
//
///<paramater name="max">max =1 最大分 其他 最小分<paramater>
int Value(int max)
{
int i,s[255];
int temp ,loc;
int num = stoneNum;
int result = 0 ;
//将每堆的石子数转转移到另一个数据中
//避免运算将石子数给清除了
for(i =0; stoneNum>i;i++)
{
s[i] =stone[i+1];
}
//num现在还有多少石子堆要进行运算的
//当num》2时候需要。从中找到需要的两堆石子
while(2 < num )
{
//用来记录每次找到要计算的记过
//每一轮的最大或者最小分
temp = s[0] + s[num-1];
//记录找到找到要合并的位置
//0 位置和最后一个。其他都是和前面一
loc = 0 ;
for(i = 1; i < num ;i++)
{
//判断是要最大分
if(max)
{
if(temp < s[i] + s[i-1])
{
temp = s[i] + s[i-1];
loc = i ;
}
}
else
{
if(temp > s[i] + s[i-1])
{
temp = s[i] + s[i-1];
loc = i ;
}
}
}
result += temp ;
//是否要合并0位置的
if(0 == loc)
{
s[0] += s[num-1];
s[num -1] = 0 ;
}
else
{
//以下两行是合并数据
s[loc-1] += s[loc];
s[loc] = 0 ;
//将数据对齐到数据中,将不用的位置给替换掉
for(i = 1; i < num-1 ;i++)
{
if(0 == s[i] )
{
s[i] = s[i+1];
s[i+1] = 0 ;
}
}
}
num--;
}
result +=s[0]+s[1];
return result ;
}
void Output(int max ,int min)
{
FILE *fp;
char file[100] = "c:\\output.txt";
char r[6];
remove(file);
if(NULL ==(fp = fopen(file,"wt+")))printf("create ouput.txt error\n"),exit(0);
sprintf(r,"%d\n%d",min,max);
fwrite(r,sizeof(r),1,fp);
fclose(fp);
system(file);
remove(file);
}
void PrintDate()
{
int i ;
printf("\ninput data :\nThere are %d groups of stones\n",stone[0]);
for(i = 1; stoneNum >= i; i++ )
{
printf("%-4d",stone[i]);
}
}