设总钱数为:t,ABCDE每次取的钱:abcde,每次取完后剩余:ta tb tc td te
由te==4*(e-1);te/5是整数,则(e-1)*4/5是整数;则(e-1)是5的倍数,所以te==4*(e-1)是20的倍数,
设te=20*n (n是整数,n>=1)
名字
取钱数
剩余
E
e
te==20n
D
d
td
C
c
tc
B
b
tb
A
a
ta
总数
t
根据描述:
t==5*a-4
a=t-ta
解得:
a==f1(ta)==ta/4+1
t==f2(a)==5*a-4
程序代码如下(累呀,因为要写好看些,哈哈~~):
//mainc.c
//********************************
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define MAXN 4000
//修改这个值可以限定最终剩余的范围*******
double f1(int x);
double f2(int x);
bool IsInteger(double x);
bool Solve(int x,int accarr[]);
bool Show(int accarr[]);
//=====================================================================
int main()
{
int accarr[11];
int n,te;
for(n=0;te<MAXN;)
{
n++;
//注意这里的n++;不能放在for循环内,不然loops的值在没达到MAXN和达到MAXN结果不同
te=n*20;
//te=n*5;
//结果是一样的,不过每次多循环了3次********
if(Solve(te,accarr))
{
Show(accarr);
break;
//注释掉这个语句,就可以查找多个值。********
}
else
;
}
printf("%d loops! \ndone!",n);
}
//------------------------------------------------------------------
double f1(int x)
{
return (double)x/4+1;//只要把x转换为double,整个表达式就是double型了。
}
double f2(int x)
{
return (double)x*5-4;
}
bool IsInteger(double x)
{
return (x==(int)x)?true:false;
}
//------------------------------------------------------------------
bool Solve(int x,int accarr[])
{
int i;
double dx=(double)x,df1;
for(i=0;i<5;i++)
{
accarr[2*i]=(int)dx;
if(IsInteger(df1=f1((int)dx)))
{
accarr[2*i+1]=(int)df1;
if(IsInteger(dx=f2((int)df1)))
;
else
return false;
}
else
return false;
}
accarr[10]=(int)dx;
return true;
}
bool Show(int accarr[])
{
printf("name
money remain\n");
printf("E
%-6d%-6d\n",accarr[1],accarr[0]);
printf("D
%-6d%-6d\n",accarr[3],accarr[2]);
printf("C
%-6d%-6d\n",accarr[5],accarr[4]);
printf("B
%-6d%-6d\n",accarr[7],accarr[6]);
printf("A
%-6d%-6d\n",accarr[9],accarr[8]);
printf("TOTAL
%-6d\n",accarr[10]);
printf("------------------\n",accarr[10]);
return true;
}
[
本帖最后由 wsj3000 于 2009-8-20 17:05 编辑 ]