Алгоритмы на Си

Материал из Wiki ТФТЛ
Перейти к: навигация, поиск

Содержание

Переопределение стандартного ввода/вывода на файлы input.txt/output.txt

//Этот пример подходит для порталов(серверов) олимпиадного программирования, 
//когда в задаче написано, что данные вводятся из файла input.txt и выводятся в файл output.txt 
 
#include <stdio.h>
 
int main()
{
   freopen("input.txt","r",stdin);
   freopen("output.txt","w",stdout);

   char Name[50];

   while (scanf("%s", Name) != EOF)
   {
       printf("%s \n", Name);
   }
}

Подсчет различных букв в слове

//Составить программу подсчета различных букв в слове.
//Муляр В.
#include <stdio.h>
#include <string.h>
char s[100];
float r=0.0;
int l,i,j,n;
main()
{
   scanf("%s",&s);
   l=strlen(s);
   for (i=0;i<l;i++)
   {
       n=0;
       for (j=0;j<l;j++)
       {
           if (s[i]==s[j]) n++;
       }
       r=r+1/(float)n;
   }
   printf("%d\n",(int)r);
}

Геометрические алгоритмы: Лежит ли точка внутри треугольника?

//Колесников ЯрослаВ
#include<iostream>
#include<conio.h>
int WherePoint(double x1,double y1,double x2,double y2,double px,double py)
{
double s;
int rez;
s=(x2-x1)*(py-y1)-(y2-y1)*(px-x1);
if (s>0)
rez=1;
else
if (s<0)
rez=-1;
else
rez=0; 
return rez;
}
bool PointInsideTreangle(double ax,double ay,double bx,double by,double cx,double cy,double px,double py)
{
int s1,s2,s3;
int rez;
rez = 0;
s1=WherePoint(ax,ay,bx,by,px,py);
s2=WherePoint(bx,by,cx,cy,px,py);
if((s2*s1)<=0)
{
return rez;
}
s3=WherePoint(cx,cy,ax,ay,px,py);
if ((s3*s2)<=0)
{
return rez;
}
rez = 1;
return rez; 
}
int main()
{
std::cout<<PointInsideTreangle(1,1,8,1,1,8,2,2);
std::cout<<", "<<PointInsideTreangle(1,1,8,1,1,8,6,6);
getch();
}

Решение системы 3-х уравнений с тремя неизвестными

//Колесников Ярослав
#include <iostream>
#include<cstdlib>
int main()
{   
float a1,a2,a3,b1,b2,b3,c1,c2,c3,d1,d2,d3,x,y,z,e,ex,ey,ez;
std::cin>>a1>>b1>>c1>>d1>>a2>>b2>>c2>>d2>>a3>>b3>>c3>>d3;
e=(a1*b2*c3+b1*c2*a3+c1*a2*b3-a3*b2*c1-b3*c2*a1-c3*a2*b1);
ex=(d1*b2*c3+b1*c2*d3+c1*d2*b3-d3*b2*c1-b3*c2*d1-c3*d2*b1);
ey=(a1*d2*c3+d1*c2*a3+c1*a2*d3-a3*d2*c1-d3*c2*a1-c3*a2*d1);
ez=(a1*b2*d3+b1*d2*a3+d1*a2*b3-a3*b2*d1-b3*d2*a1-d3*a2*b1);
setlocale(LC_ALL, "rus");
if((e==0) && ((ex==0)||(ey==0)||(ez==0)))
std::cout<<"Besconechnoe mnogestvo";
else 
{
if ( (e!=0 ) && ((ex==0) || (ey==0) || (ez==0)))
std::cout<<"Net Reshenii";
else
{
x=ex/e; std::cout<<"x= "<<x;
y=ey/e; std::cout<<"\ny= "<<y;
z=ez/e; std::cout<<"\nz= "<<z;
}
}
system("Pause");
return(0);
}

Составить программу перевода двоичного числа в десятичное

//Колесников Ярослав
#include<string.h>
#include<cstdlib>
#include <iostream>
int main()
{
setlocale(LC_ALL, "rus");
char bin[256] = {0};
std::cout<<"Двоичное число: ";
std::cin>>bin;
int len = strlen(bin);
int pwr = 1;
int dec = 0;
for(int i = 0; i < len; i++)
{
dec += pwr*(bin[(len - 1) - i] - '0');
pwr *= 2;
}
std::cout<<"Десятичное число: "<<dec;
system("pause");
return 0;
}

Вычисление факториала

//Колесников Ярослав
#include <iostream>
int f(int x)
{
if (x==1)
return 1;
else
return x*f(x-1);
}
int main()
{
int n;
setlocale(LC_ALL, "rus");
std::cout<<"Введите N:";
std::cin>>n;
std::cout<<"N!= "<<f(n);
}

Рекурсивный алгоритм: нахождения НОД и НОК двух чисел

//Колесников Ярослав
#include <iostream>
int NOD(int x, int y)
{
if (x != 0)
return NOD(y%x,x);
else
return y;
}  
int NOK(int x, int y)
{
return (x/NOD(x,y))*y;
}
int main()
{
setlocale(LC_ALL, "rus");
int x,y;
std::cin>>x>>y;
std::cout<<"НОД этих чисел= "<<NOD(x,y);
std::cout<<"\nНОК этих чисел= "<<NOK(x,y);
return 0;
}

Какая точка (A или B) ближе к началу координат?

//Колесников Ярослав 
#include<iostream>
#include<conio.h>
#include<cmath>
int main()
{
double x1,y1,x2,y2,d1,d2;
std::cin>>x1>>y1>>x2>>y2;
d1=sqrt(pow(x1,2)+pow(y1,2));
d2=sqrt(pow(x2,2)+pow(y2,2));
if (d1<d2)
std::cout<<"A Blizhe";
else 
if(d1>d2)
std::cout<<"B Blizhe";
else
std::cout<<"Odinakovo";
getch();
}

Все ли элементы массива различны?

//Колесников Ярослав 
#include<iostream>
#include<conio.h>
int main()
{
int a[10],k,i;
k=0;
std::cin>>a[0];
for(i=1;i<10;i++)
{
std::cin>>a[i];
if(a[i]!=a[0])
{
k=1;
}
}
if(k==1)
{
std::cout<<"Razlichnye";
}
else
{
std::cout<<"Odinakovye";
}
return 0;
getch();
}

Поиск среднего арифметического в массиве

//Колесников Ярослав
#include<iostream>
#include<conio.h>
int main()
{
int a[100],i,n;
long s;
s=0;
n=0;
for(i=1;i<=10;i++)
{
std::cin>>a[i];
s=s+a[i];
n++;
}
std::cout<<s/n;
getch();
return 0;
}

Подсчет суммы элементов одномерного массива

//Колесников Ярослав.
#include<iostream>
#include<conio.h>
int main()
{
int a[100],i;
long s;
s=0;
for(i=1;i<=10;i++)
{
std::cin>>a[i];
s=s+a[i];
}
std::cout<<s;
getch();
return 0;
}

Составить программу печати всех делителей натурального числа A

 //Колесников Ярослав.
 #include <iostream>
 #include <math.h>
 #include <conio.h>
 int main()
 {
 int a,n,c,d;
 std::cin >> a;
 n=1;
 while(n<=sqrt(a))
 {
 c=a%n;
 d=a/n;
 if(c==0)
 {
 std::cout<<","<<n;
 if(n!=d)
 {
 std::cout<<","<<d;
 }
 }
 n++;
 }
 getch();
return 0;
}

Перестановка букв в слове (циклический сдвиг вправо)

//Титов Никита.
#include <stdio.h>
#include <string.h>
char s[255],c;
int u,j,n;
main()
{
   scanf("%s", s);
   c=s[strlen(s)-1];
   for(int i=strlen(s)-1;i>0;i--) s[i]=s[i-1];
   s[0]=c;  
   printf("%s",s);
   scanf("%s", &s);
}

Подсчет суммы цифр числа

//Титов Никита.
#include <stdio.h>
int a,x,i,s;
int main()
{
   scanf("%d", &a);
   x=a;
   s=0;
   while ( x!=0)
   {
         s = s+(x%10);
         x = x/10;
   }
   printf("%d",s);
}

Составить программу печати всех простых чисел до 500

//Муляр Владислав
#include <stdio.h>
#include <math.h>
int i,j,lim,LIMIT;
main()
{
     LIMIT=500;
     for(i=1;i<=LIMIT;i++)
     {
     j=2;
     lim=(int) sqrt(i);
     while(i % j !=0 && j<=lim) j++;      
     if (j>lim) printf("%d ",i);
} 
     return 0;
     }

Циклический сдвиг элементов массива вправо

//Титов Никита.
#include <stdio.h>
int a[10],x,i;
int main()
{
   for (i=1; i<10; i++)
   {
   scanf("%d", &a[i]);
   }
   x=a[10];
   for (i=10; i>=2; i--)
   a[i]=a[i-1];
   a[1]=x;
   printf("after:");
   for (i=1; i<10; i++)
   printf("%d", a[i]);
   return 0;
}

Решение уравнения: A*x^2 + B*x + C = 0

//Попов Александр.
#include <math.h>
#include <stdio.h>
#include <conio.h>
main() {
      float a, b, c, d, x, x1, x2;
      scanf("%f %f %f", &a, &b, &c);
      d=b*b-4*a*c;
      if(d<0) {
              printf("korney net\n");
              } else
              if (d==0) {
                        x=(-b)/2*a;
                        printf("%f", x);
                        } else
                        if(d>0) {
                                x1=(-b+sqrt(d))/2*a;
                                printf("%f\n", x1);
                                x2=(-b-sqrt(d))/2*a;
                                printf("%f\n", x2);
                                }
                                getch();
                                }

Вычисление площади треугольника по координатам вершин

//Титов Никита.
#include <stdio.h>
#include <math.h>
int main()
{
  float x1,y1,x2,y2,x3,y3,a,b,c,p,s;
   scanf("%f %f %f %f %f %f",&x1,&y1,&x2,&y2,&x3,&y3);
   c=sqrt(pow(y1-y2,2)+pow(x1-x2,2));
   a=sqrt(pow(y2-y3,2)+pow(x2-x3,2));
   b=sqrt(pow(y1-y3,2)+pow(x1-x3,2));
   p=(a+b+c)/2;
   s=sqrt(p*(p-a)*(p-b)*(p-c));
   printf("%f", s);
   scanf("%f", c);
   return 0;
}

Поиск минимального элемента в массиве

//Муляр Владислав

#include <stdio.h>
int min,i,a[10];
main()
{
     for(i=0;i<10;i++) scanf("%d\n",&a[i]);
     min=a[1];
for(i=0;i<10;i++) if (min > a[i]) min=a[i];
printf("%d\n",min);
return 0;
}