Алгоритмы на Си
Материал из Wiki ТФТЛ
Содержание
- 1 Переопределение стандартного ввода/вывода на файлы input.txt/output.txt
- 2 Подсчет различных букв в слове
- 3 Геометрические алгоритмы: Лежит ли точка внутри треугольника?
- 4 Решение системы 3-х уравнений с тремя неизвестными
- 5 Составить программу перевода двоичного числа в десятичное
- 6 Вычисление факториала
- 7 Рекурсивный алгоритм: нахождения НОД и НОК двух чисел
- 8 Какая точка (A или B) ближе к началу координат?
- 9 Все ли элементы массива различны?
- 10 Поиск среднего арифметического в массиве
- 11 Подсчет суммы элементов одномерного массива
- 12 Составить программу печати всех делителей натурального числа A
- 13 Перестановка букв в слове (циклический сдвиг вправо)
- 14 Подсчет суммы цифр числа
- 15 Составить программу печати всех простых чисел до 500
- 16 Циклический сдвиг элементов массива вправо
- 17 Решение уравнения: A*x^2 + B*x + C = 0
- 18 Вычисление площади треугольника по координатам вершин
- 19 Поиск минимального элемента в массиве
Переопределение стандартного ввода/вывода на файлы 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; }