2009/01/12

Хэрэглэгчийн Функц

Бид С хэлийг ашиглан өмнө тулгарсан бодлогыг бодох бүртээ sqrt(x), strcmp(s1,s2), pow(x,y) гэх мэт функцуудтэй алхам тутамдаа тааралдаж,
ашиглаж ирсэн билээ. Харин хэрэглэгч өөрийн сонирхолд нийцүүлэн, олон давтагдах үйлдэлийг товчлох, бичлэгийг хэмнэх зорилгоор функц үүсгэн ашиглаж болдог. Ямар ч програмчлалын хэлэнд функц үүсгэн ашиглах ерөнхий зарчим нь адилхaн байдaг.

С хэлний функцын ерөнхий бичлэг нь:
<Буцаах утгын төрөл><Функцийн нэр>(<Төрөл><Зарлалт>)
<Хувьсагчдыг зарлах>
{
<Дотооод хувьсагчдыг зарлах>
<Командууд>
...
return (Буцаах утга);
}
Хэрвээ функц утга буцаах шаардлагүй бол түүний нэрийн өмнө void түлхүүр үгийг бичиж өгөх буюу ямар ч түлхүүр үг бичихгүй байж болно. (void гэсэн түлхүүр үгийг бичиж өгөөгүй үед return 0; гэсэн бичлэгийг ашигласан байдгийг анзаарсан байх.)
Функц руу утга дамждаг бол тухайн хувьсагчдыг функцийн нэрийн ард хаалтан дотор төрөлийн хамт бичнэ.
Хэрэв функц утга хүлээн авдаггүй бол хаалтан дотор юу ч бичихгүй.

Харин одоо функц ашиглан бодсон бодолтыг сонирхъё.
SPOJ-ын бодлогын архив
2222. Бутархай
Бодлогын дугаар: CSMS0010

Энгийн бутархайн хүртвэр нь хуваариасаа бага бол зөв бутархай гэнэ. Мөн өгөгдсөн бутархайгаас хүртвэр болон хуваариараа бага бөгөөд түүнтэй тэнцүү бутархай байхгүй бол анхны бутархайг үл хураагдах бутархай гэнэ. Хүртвэр болон хуваарийнх нь нийлбэр n-тэй тэнцүү байх хамгийн их утгатай зөв, үл хураагдах бутархайг ол.
Input

ганц n бүхэл тоо байна (3 <= n <= 1000)
Output

олдсон бутархайн хүртвэр болон хуваарийг гаргана
Example

Input:
10

Output:
3 7

Input:
23

Output:
11 12

Өгүүлбэрээс бутархайн хуваарь, хүртвэрийг нийлбэр нь n, тэдгээрийн ялгавар нь хамгийн бага, ХИЕХ нь 1-тэй тэнцүү байхаар авах нь тодорхой байна. Хүртвэрийг n/2-оос эхлэн нэг нэгээр бууруулж, хуваарийг нэг нэгээр нэмэгдүүлэх үйлдлийг ХИЕХ нь 1 болтол хийх шийдлийг сонгоё. Харин ХИЕХ=1 эсэхйиг шалгахдаа Евклидийг алгоритмийг ашиглан 2 тооны ХИЕХ-ыг олох функц үүсгэн ашиглая.

#include <stdio.h>
long int XIEX(long int a,long int b)
{
while(a!=0 && b!=0)
{
if(a>b) a%=b;
else b%=a;
}
if (a!=0 && b==0) return a;
if (b==0 && a!=0) return b;
}
void main()
{
long int n;
long int x,y;
scanf("%ld",&n);
for(x=n/2; x>0; x--)
{
y=n-x;
if(XIEX(x,y)==1)/**/
{
printf("%ld %ld\n",x,y);
break;
}
}
}

1 comment:

  1. Hi Hanoi tower n tuhai tawj ugj tuslaash plse

    ReplyDelete

Миний бичсэн бичлэг танд өчүүхэн ч болтугай хэрэг болсон бол сэтгэгдлээ бичиж үлдээхийг хүсье. Баярлалаа :)