Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_po_poryadku_proga.doc
Скачиваний:
4
Добавлен:
15.04.2019
Размер:
1.07 Mб
Скачать

3.3. Цикл while

Цикл while является циклом с предпроверкой условия выхода. Конструкция while-цикла имеет синтаксис: while (выражение)

оператор; //тело цикла

Если при вычислении выражения получается отличный от нуля результат, то выполняется оператор тела цикла, после чего выражение вновь вычисляется. Выражение должно иметь арифметический либо приводимый к нему тип.

В качестве оператора может выступать отдельный оператор или блок операторов. Отдельный оператор всегда должен за­канчиваться точкой с запятой (ограничителем операторов). Если тело цикла представляет собой блок операторов, то он должен быть заключен в фигурные скобки.

Выражение цикла while вычисляется прежде, чем выполняются операторы тела цикла.

Условием выхода из цикла является равенство нулю (false) выражения цикла.

Если при первом же вычислении выражения цикла while получено значение false (0), то операторы тела цикла не выполняются ни разу.

4.1. Алгоритм Евклида

Дана пара (a, b). Шаг 1. Поделить a на b с остатком r Шаг 2. Если r = 0, то НОД (a, b) = b Шаг 3. Если r <>0, то перейти к шагу 1 с парой (b, r)

do

if (a>b)

a%=b;

else

b%=a;

while ((a !=0) && (b!=0));

4.2. Алгоритмы обмена чисел

Имеется две переменные a и b. Поменять их значения местами. int a,b, tmp; {1} tmp = a; a = b; b = tmp; {2} a = a + b; b = a - b; a = a - b; {3} a = a ^ b; b = a ^ b; a = a ^ b;

4.3.А. Для заданного натурального числа определить количество единичных бит в его представлении.

Суть алгоритма в том, что заводится битовая "маска", содержащая единственный ненулевой бит, позиция которого при работе цикла меняется от младшего к старшему.

При единичном значении очередного бита проверяемого числа, логическое умножение очередного значения маски на содержимое проверяемого числа маску не меняет.

int Count_Bit(int a)

{

int bit;

int mask = 1;

int num = 0;

for ( int i = 0;i <=31;i++)

{

bit=mask & a;

if (bit == mask) num++;

mask = mask << 1;

}

return num;

}

4.3.B. Найти количество повторений каждой цифры у заданного натурального числа

void SumDigit (int a){

int b = a;

int c;

printf ("Povtorenie %d\n", a);

for(int i = 0; i<10; ++i)

{

c = 0;

a = b;

while(a>0)

{

if(a%10 == i) c++;

a /=10;

}

if(c!=0)

printf ("%d => %d\n", i, c);

}

}

4.3.C. Перевод из 10-й с/с в 2..9

int a,r; { // ввод n a = 0; r = 1; while (n >= 1) { a = a + (n % p) * r; r = r * 10; n = n / p; }

либо

int main()

{

char M1[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

int M[32]; //Массив под остатки

int a,i,n;

scanf("%d %d", &a, &n);

i=0;

while (a!=0)

{

M[i]=a%n;

a/=n;

i++;

}

for(i--;i>=0;i--)

printf("%c", M1[M[i]]);

printf("\n");

}

D. Дихотомический поиск

int BinSearch(int *M, int left, int right, int x)

{

int mid;

while (left<=right)

{

mid=(left+right)/2;

if (M[mid]==x)

return(mid);

else

{

if (M[mid]>x)

right=mid-1; else

left=mid+1;

}

}

return(-1);

}

E. Проверка, простое ли число

int Prost (int a)

{ int i, n,flag;

double r;

if ((a==2)||(a==3))

flag =1;

else

{

i=2;

flag =1;

r=a;

n= (int)floor(sqrt (r));

while ((i <=n) && flag )

if (!(a%i)) flag=0;

else ++i;

}

return flag;

}

F. Совершенные числа

Натуральное число Р называется совершенным, если оно равно сумме всех своих делителей кроме Р. Доказано, что если р и 2р-1 - простые числа, то число Р=(2р-1)*2^(p-1) является совершенным

void Number_Sover (){

int n,k,p,i,flag,ch;

printf("Enter N ");

scanf("%d",&n);

p=2;i=1;

while (i<=n) {//простое или нет

int j=2;

flag=1; //да

while ((j<=p/2) && (flag))

if ( !(p%j)) flag=0;//нет

else ++j;

if ((flag)||(p==2) ||(p==3)){

int step=1; int m=p-1; int x=2;

while (m != 0){

if (m % 2 == 1) step=step*x;

x=x*x;

m=m / 2;

}

ch=step*(step*2-1);

printf("%d \n",ch);

i++;

}

p++;

}}

E. Числа Мерсенна

Числами Мерсенна называют числа вида 2^n-1

void Number_Mersenne(int m)

{

printf("CM\n");

int r=0;

for (int i=1;i<=m;i++)

{

r=(2<<i-1)-1;

printf("%d\n",r);

}

}

F. Числа Армстронга

n-значное число называется числом Армстронга, если оно равно сумме n-ых степеней своих цифр.

#include <stdio.h>

#include <math.h>

int main()

{

long a,b,k,c,chislo,z;

long double m,t,k1;

m=0; k=0;

printf("Input two borders a b (a<b): ");

scanf("%d %d", &a, &b);

for (int i=a; i<b+1; ++i){ //перебор всех чисел

m=0; k=0; z=i; chislo=i;

while (z) //определение количества знаков

{k++;

z/=10;}

k1=k;

for (int p=1; p<k+1; ++p) //подсчет суммы степеней цифр

{

c=chislo%10;

chislo=(chislo-c)/10;

t=pow(c,k1);

m+=t;

}

if (m==i)

printf("chislo Armstronga: %d\n", i);

}}

G. Числа Фибоначчи Число называется числом Фибоначчи, если оно является одним из членов последовательности: fn = fn-1 + fn-2, где f0 = 1 и f1 = 1.

Можно также определить n-й член ряда Фибоначчи, непосредственно подсчитав выражение:

H. Числа Смита

Число называется числом Смита, если сумма цифр числа равна сумме цифр разложения этого числа на простые множители.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]