Ученики из гимназии №2 г.Салавата так разогнались с решениями задач на циклы, что я попробую подкинуть им кое-что посложнее.
Во вторник на занятии мы с ними займемся генерацией случайных чисел в Java -- и я уже припас для них несколько совсем непростых задач.
Хотя -- с такими темпами иди их знай)))
Задание №1
Напиши класс, который выводит
на экран двузначные положительные четные числа (в порядке возрастания).
Решение должно быть написано:
- · без использования команды if;
- · с увеличением счетчика только на 1.
Задание №2
Напиши класс, который выводит
на экран трехзначные положительные нечетные числа (в порядке убывания).
Решение должно быть написано:
- · без использования команды if;
- · с изменением счетчика только на 1.
Задание №3
Последовательность Фибоначчи
– серия чисел, в которой первые два равно 1, а любое новое равно сумме двух
предыдущих.
Напиши класс, который
принимает с клавиатуры целое положительное число N и выводит на экран N чисел из последовательности Фибоначчи.
Задание №4
Автоморфным называется число,
квадрат которого заканчивается на само же это число.
Напиши класс, который выводит
на экран все автоморфные числа, содержащие не более 3 цифр.
Задание №5
Напиши класс, который
принимает с клавиатуры целое положительное число и проверяет, является ли оно
квадратом какого-то целого положительного числа.
Задание №6
Напиши класс, который
принимает с клавиатуры целое положительное число и проверяет, является ли оно
квадратом какого-то своего делителя.
Задание №7
Самовлюблённым (или числом
Армстронга) называется натуральное число, которое равно сумме
своих цифр, возведённых в степень, равную количеству его цифр.
Напиши класс, который выводит
на экран все двух- и трехзначные числа Армстронга.
Задание №8
Числа Цукермана — такие натуральные
числа, которые делятся на произведение своих цифр.
Напиши класс, который выводит
на экран все двух- и трехзначные числа Цукермана.

Озадачили на ночь)) Вот первые две, остальные, надеюсь, решу завтра)
ОтветитьУдалитьimport java.util.*;
class Zadanie_1
{
static Scanner reader = new Scanner (System.in);
public static void main (String [] args)
{
int x;
for(x = 9; x<100; x++)
{
x=x+1;
System.out.print (x+" ") ;
}
}
}
import java.util.*;
class Zadanie_2
{
static Scanner reader = new Scanner (System.in);
public static void main (String [] args)
{
int x;
for(x = 1000; x>100; x--)
{
x=x-1;
System.out.print (x+" ") ;
}
}
}
О, Annie, способ, который ты использовала в решениях, это классическая не-ошибка, но крайне(!) нежелательный прием: изменять счетчик цикла внутри тела цикла -- дурной тон))) и логически неправильно -- а зачем же нам тогда нужен заголовок???
ОтветитьУдалитьТак что решения, тобой предложенные -- работают технически, но неприемлимы "идеологически")))
Есть вариант без узменения счетчика и в заголовке, и в цикле. Математический способ)))
А в Delphi программа часто ошибку выдает и не компилируется если изменять счетчик внутри цикла, хотя иногда и там работает
ОтветитьУдалитьИменно потому, что, строго говоря, существует правило: "в теле цикла можно пользоваться переменной-счетчиком, но нельзя ее изменять". Нельзя -- в смысле неправильно, а более строгих языках и впрямь нельзя.
ОтветитьУдалитьimport java.util.*;
ОтветитьУдалитьclass z7_1
{
static Scanner reader=new Scanner(System.in);
public static void main(String[] args)
{
int i;
for (i=5; i<=49; i++)
System.out.print((i*2)+" ");
}
}
import java.util.*;
class z7_2
{
static Scanner reader=new Scanner(System.in);
public static void main(String[] args)
{
int i;
for (i=499; i>=50; i--)
System.out.print((i*2+1)+" ");
}
}
import java.util.*;
class z7_3
{
static Scanner reader=new Scanner(System.in);
public static void main(String[] args)
{
int a,b,c,i,n;
a=1;
b=1;
n=reader.nextInt();
if (n==1) System.out.print("1");
else if (n==1) System.out.print("1 1");
else
{
System.out.print("1 1 ");
for (i=1; i<=n-2; i++)
{
c=a+b;
a=b;
b=c;
System.out.print(b+" ");
}
}
}
}
import java.util.*;
class z7_4
{
static Scanner reader=new Scanner(System.in);
public static void main(String[] args)
{
int i;
for (i=0; i<=999; i++)
{
if (((i*i)%10==i)||((i*i)%100==i)||((i*i)%1000==i))
System.out.print(i+" ");
}
}
}
import java.util.*;
class z7_5
{
static Scanner reader=new Scanner(System.in);
public static void main(String[] args)
{
int i,a,b,c;
c=0;
a=reader.nextInt();
b=(int)(Math.sqrt(a))+1;
for (i=0; i<=b; i++)
{
if (a==i*i)
c=1;
}
if (c==1) System.out.print("Да, является");
else System.out.print("Нет, не является");
}
}
import java.util.*;
class z7_6
{
static Scanner reader=new Scanner(System.in);
public static void main(String[] args)
{
int i,a,b,c;
c=0;
a=reader.nextInt();
b=(int)(Math.sqrt(a))+1;
for (i=0; i<=b; i++)
{
if ((a==i*i)&&(a%i==0))
c=1;
}
if (c==1) System.out.print("Да, является");
else System.out.print("Нет, не является");
}
}
import java.util.*;
class z7_7
{
static Scanner reader=new Scanner(System.in);
public static void main(String[] args)
{
int i;
for (i=10; i<=99; i++)
{
if (i==(i%10)*(i%10)+(i/10)*(i/10))
System.out.print(i+" ");
}
for (i=100; i<=999; i++)
{
if (i==(i%10)*(i%10)*(i%10)+(i/100)*(i/100)*(i/100)+((i/10)%10)*((i/10)%10)*((i/10)%10))
System.out.print(i+" ");
}
}
}
import java.util.*;
class z7_8
{
static Scanner reader=new Scanner(System.in);
public static void main(String[] args)
{
int i;
for (i=10; i<=99; i++)
{
if ((i%10!=0)&&(i/10!=0))
if (i%((i%10)*(i/10))==0)
System.out.print(i+" ");
}
for (i=100; i<=999; i++)
{
if ((i%10!=0)&&(i/100!=0)&&((i/10)%10!=0))
if (i%((i%10)*(i/100)*((i/10)%10))==0)
System.out.print(i+" ");
}
}
}
В задаче №3 мне непонятна конструкция
ОтветитьУдалитьif (n==1) System.out.print("1");
else if (n==1) System.out.print("1 1");
наверное, во второй строчке ==2?
Там же следующая за этой конструкцией else позволяет "прорваться" и отрицательным n (((
Надежнее (ИМХО) использовать 3 if'а. Но необязательно. Лучше поправить это решение.
Смотрю дальше)))
Задачу №4 я люблю показывать в виде трех циклов (однозначные, двузначные, трехзначные) -- мне, как учителю, проще объяснять решение без сложного условия.
ОтветитьУдалитьА это решение -- красивое, конечно.
Задачу №5 мы решаем еще до знакомства с библиотекой Math, поэтому я объясняю, почему в заголовке цикла хорошо работает условие i<=b/2 -- которое используется потом в куче задач.
ОтветитьУдалитьА вместо с=1 я показываю использование переменных булева типа (flag=false и так далее).
Задача №7: ужасно вредная штука такие длиннющие выражения в условии.
ОтветитьУдалитьСовсеременный подход: вычисли несколько нужных значений, но пиши минимальной сложности условие.
А так -- отлично.
И разбиение на два цикла -- грамотно, хотя ведь можно была с одним циклом и перекрученных if'ом написать)))
Задача №8: работает, да -- но насколько понятнее она получается, если разбить сложносоставленный if на простые части.
ОтветитьУдалить"Лучше много раз по разу"(С), пардон, конечно)))
Спасибо за замечание!
ОтветитьУдалитьЧетвертая
import java.util.*;
class Zadanie_4
{
static Scanner reader = new Scanner (System.in);
public static void main (String [] args)
{
int x,y,y1,y2,x1,z,z1,b,b1;
for(x = 1; x<10; x++)
{
y=x*x;
x1=(y%10);
if (x1==x)
System.out.print (x+" ") ;
}
for(z = 10; z<100; z++)
{
y1=z*z;
z1=(y1%100);
if (z1==z)
System.out.print (z+" ");
}
for(b = 100; b<1000; b++)
{
y2=b*b;
b1=(y2%1000);
if (b1==b)
System.out.print (b+" ");
}
}
}
import java.util.*;
ОтветитьУдалитьclass Zadanie_5
{
static Scanner reader = new Scanner (System.in);
public static void main (String [] args)
{
int x,y,x1;
y=reader.nextInt ();
if (y>0)
for(x = 1; x<1000000; x++)
{
x1=x*x;
if (x1==y)
System.out.print (x+" ");
}
else System.out.print ("Неверный ввод") ;
}
}
import java.util.*;
ОтветитьУдалитьclass Zadanie_6
{
static Scanner reader = new Scanner (System.in);
public static void main (String [] args)
{
int x,y,x1;
y=reader.nextInt ();
if (y>0)
for(x = 1; x<1000000; x++)
{
x1=x*x;
if ((y%x==0)&&(x1==y))
System.out.print (x+" ");
}
else System.out.print ("Неверный ввод") ;
}
}
import java.util.*;
ОтветитьУдалитьclass Zadanie_7
{
static Scanner reader = new Scanner (System.in);
public static void main (String [] args)
{
int x,x1,x2,x3,x4,y,y1,y2,y3,y4,y5,y6;
for(x = 10; x<100; x++)
{
x1=(x/10);
x2=(x%10);
x3=x1*x1;
x4=x2*x2;
if (x3+x4==x)
System.out.print (x+" ");
}
for(y = 100; y<1000; y++)
{
y1=(y/100);
y2=((y/10)%10);
y3=(y%10);
y4=y1*y1*y1;
y5=y2*y2*y2;
y6=y3*y3*y3;
if (y4+y5+y6==y)
System.out.print (y+" ");
}
}
}
import java.util.*;
ОтветитьУдалитьclass Zadanie_8
{
static Scanner reader = new Scanner (System.in);
public static void main (String [] args)
{
int x,x1,x2,x3,y,y1,y2,y3,y4;
for(x = 10; x<100; x++)
{
x1=(x/10);
x2=(x%10);
x3=x1*x2;
if ((x1!=0)&&(x2!=0)&&(x%x3==0))
System.out.print (x+" ");
}
for(y = 100; y<1000; y++)
{
y1=(y/100);
y2=((y/10)%10);
y3=(y%10);
y4=y1*y2*y3;
if ((y1!=0)&&(y2!=0)&&(y3!=0)&&(y%y4==0))
System.out.print (y+" ");
}
}
}
Вот с третьей честно не справилась
ОтветитьУдалитьhttp://ru.wikipedia.org/wiki/Числа_Фибоначчи
ОтветитьУдалитьVincenc Scientiam, не справилась с тем, как программу написать :)
ОтветитьУдалитьAnnie, ты, безусловная умничка.
ОтветитьУдалитьНо к задача №5 я все же придерусь, ладно?)))
Ты написала класс, который выводит на экран числа, квадрат которых равен введенному с клавиатуры числу.
А надо -- чтобы программа писала "Да, есть такие" или "Нет, не найдено ни одного". То есть то, что она выводит на экран подходящие числа -- замечательно, но мало! ))
И еще -- не обязательно "гнать" цикл до такого большого значения, можно ограничиться "до половины числа", например -- все равно во второй половине заведомо нет подходящих значений)))
Annie, к задаче №6 те же придирки, что и к 5-й
ОтветитьУдалитьА вот в задаче №8 предлагаю и тебе, и ребятам провести эксперимент (все решено отлично, нет никаких замечаний): в if'е поменяйте местами первое и второе условие -- программа будет срываться.
Догадаетесь, почему? )))
А я при решении восьмой задачи как раз с этим сталкивалась. Может, потому что программа сначала делит (получается возможность деления на ноль) и лишь потом просматривает следующие условия, указывающие, что число нулю равно быть не должно?
ОтветитьУдалитьТы абсолютно права! При использовании связки && сначала проверяется самое левое условие, затем -- второе, и так далее.
ОтветитьУдалитьСамое замечательное, что если одно условие не выполняется, остальные уже не проверяются совсем -- это нащывается "быстрый and". А если поставить на первое место проверку делимости -- до(!) првоерки на нулевое значение -- сбой.
Молодец.