我的第一题答案:
/*假设这两个数最小的一个从1开始变化
min max 遇点表示此数跟最小熟配合必死
1 2. 3----
2 -----遇2通杀
3 4 5. 6-----
4 5 6 7. 8----
5 -----遇5通杀
6 7 8 9 10.11----
7 -----遇7通杀
8 9 10 11 12 13.14----
9 10 11 12 13 14 15.16----
10 -----遇10通杀
11 12-------------17 18.19----
*/
#include "stdio.h"
#include "stdlib.h"
int main()
{
long a,b,i,j;
int n=1;
struct str
{
long k; //存放最小通杀数
struct str *next;
}*head,*p,*pb,*pa;
struct ss //存放测试的几组输入数据
{
long nexta;
long nextb;
struct ss *next;
}*h1,*hp,*hd;
while(1)
{
scanf("%ld",&a);
if(a<1) break;
scanf("%ld",&b);
if(b<1) break;
else
{
hp=(struct ss*)malloc(sizeof(struct ss));
hp->nexta=a;
hp->nextb=b;
hp->next=NULL;
if(n==1)
{
h1=hd=hp;
n=0;
}
else hd->next=hp;
hd=hp;
}
}
printf("输入完毕\n");
while(h1)
{
a=h1->nexta;
b=h1->nextb;
hp=h1->next;
h1->next=NULL;
free(h1);
h1=hp;
if(a>b)
{
j=a;
a=b;
b=j;
} /*a小b大*/
if(a==1)
{
if(b==2) printf("0\n");
else printf("1\n");
continue;
}
else if(a>1)
{
head=(struct str*)malloc(sizeof(struct str));
head->k=2;
head->next=NULL;
pa=p=head;
j=1; //最小通杀数相对与对应的i的增加幅度
for(i=2;i<=a;i++)
{
if(a==pa->k)
{
n=1;
printf("1\n");
break;
}
else
{
if(i==pa->k)
{
if(pa->next!=NULL)
pa=pa->next;
}
else
{
pb=(struct str*)malloc(sizeof(struct str));
j+=1;
pb->k=i+j;
pb->next=NULL;
p->next=pb;
p=pb;
if(pa->k<i)
{
pa=pa->next;
}
}
}
}
if(n!=1)
{
if(b==p->k) printf("0\n");
else printf("1\n");
}
}
while(head!=NULL)
{
pb=head->next;
head->k=NULL;
head->next=NULL;
free(head);
head=pb;
}
n=0;
}
return 0;
}
这个不完善,继续优化下去就能得到黄金分割的方法了
英语不好还想学编程??逆天之路,不由分说!! 数学太差还想学编程??离经叛道,义无返顾!!