понедельник, 26 сентября 2011 г.

Несколько задач на циклы, похитрее обычных (№4)


Ученики из гимназии №2 г.Салавата так разогнались с решениями задач на циклы, что я попробую подкинуть им кое-что посложнее. 

Во вторник на занятии мы с ними займемся генерацией случайных чисел в Java -- и я уже припас для них несколько совсем непростых задач.

Хотя -- с такими темпами иди их знай))) 



Задание №1
Напиши класс, который выводит на экран двузначные положительные четные числа (в порядке возрастания).
Решение должно быть написано:
  • ·         без использования команды if;
  • ·         с увеличением счетчика только на 1.


Задание №2
Напиши класс, который выводит на экран трехзначные положительные нечетные числа (в порядке убывания).
Решение должно быть написано:
  • ·         без использования команды if;
  • ·         с изменением счетчика только на 1.


Задание №3
Последовательность Фибоначчи – серия чисел, в которой первые два равно 1, а любое новое равно сумме двух предыдущих.
Напиши класс, который принимает с клавиатуры целое положительное число N и выводит на экран N чисел из последовательности Фибоначчи.

Задание №4
Автоморфным называется число, квадрат которого заканчивается на само же это число.
Напиши класс, который выводит на экран все автоморфные числа, содержащие не более 3 цифр.

Задание №5
Напиши класс, который принимает с клавиатуры целое положительное число и проверяет, является ли оно квадратом какого-то целого положительного числа.

Задание №6
Напиши класс, который принимает с клавиатуры целое положительное число и проверяет, является ли оно квадратом какого-то своего делителя.

Задание №7
Самовлюблённым (или числом Армстронга) называется натуральное число, которое равно сумме своих цифр, возведённых в степень, равную количеству его цифр.
Напиши класс, который выводит на экран все двух- и трехзначные числа Армстронга.

Задание №8
Числа Цукермана — такие натуральные числа, которые делятся на произведение своих цифр.
Напиши класс, который выводит на экран все двух- и трехзначные числа Цукермана.


22 комментария:

  1. Озадачили на ночь)) Вот первые две, остальные, надеюсь, решу завтра)

    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+" ") ;
    }
    }
    }

    ОтветитьУдалить
  2. О, Annie, способ, который ты использовала в решениях, это классическая не-ошибка, но крайне(!) нежелательный прием: изменять счетчик цикла внутри тела цикла -- дурной тон))) и логически неправильно -- а зачем же нам тогда нужен заголовок???

    Так что решения, тобой предложенные -- работают технически, но неприемлимы "идеологически")))

    Есть вариант без узменения счетчика и в заголовке, и в цикле. Математический способ)))

    ОтветитьУдалить
  3. А в Delphi программа часто ошибку выдает и не компилируется если изменять счетчик внутри цикла, хотя иногда и там работает

    ОтветитьУдалить
  4. Именно потому, что, строго говоря, существует правило: "в теле цикла можно пользоваться переменной-счетчиком, но нельзя ее изменять". Нельзя -- в смысле неправильно, а более строгих языках и впрямь нельзя.

    ОтветитьУдалить
  5. 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+" ");
    }
    }
    }

    ОтветитьУдалить
  6. В задаче №3 мне непонятна конструкция
    if (n==1) System.out.print("1");
    else if (n==1) System.out.print("1 1");

    наверное, во второй строчке ==2?

    Там же следующая за этой конструкцией else позволяет "прорваться" и отрицательным n (((

    Надежнее (ИМХО) использовать 3 if'а. Но необязательно. Лучше поправить это решение.
    Смотрю дальше)))

    ОтветитьУдалить
  7. Задачу №4 я люблю показывать в виде трех циклов (однозначные, двузначные, трехзначные) -- мне, как учителю, проще объяснять решение без сложного условия.
    А это решение -- красивое, конечно.

    ОтветитьУдалить
  8. Задачу №5 мы решаем еще до знакомства с библиотекой Math, поэтому я объясняю, почему в заголовке цикла хорошо работает условие i<=b/2 -- которое используется потом в куче задач.

    А вместо с=1 я показываю использование переменных булева типа (flag=false и так далее).

    ОтветитьУдалить
  9. Задача №7: ужасно вредная штука такие длиннющие выражения в условии.
    Совсеременный подход: вычисли несколько нужных значений, но пиши минимальной сложности условие.
    А так -- отлично.
    И разбиение на два цикла -- грамотно, хотя ведь можно была с одним циклом и перекрученных if'ом написать)))

    ОтветитьУдалить
  10. Задача №8: работает, да -- но насколько понятнее она получается, если разбить сложносоставленный if на простые части.

    "Лучше много раз по разу"(С), пардон, конечно)))

    ОтветитьУдалить
  11. Спасибо за замечание!

    Четвертая
    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+" ");
    }
    }
    }

    ОтветитьУдалить
  12. 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 ("Неверный ввод") ;
    }
    }

    ОтветитьУдалить
  13. 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 ("Неверный ввод") ;
    }
    }

    ОтветитьУдалить
  14. 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+" ");
    }
    }
    }

    ОтветитьУдалить
  15. 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+" ");
    }
    }
    }

    ОтветитьУдалить
  16. Вот с третьей честно не справилась

    ОтветитьУдалить
  17. http://ru.wikipedia.org/wiki/Числа_Фибоначчи

    ОтветитьУдалить
  18. Vincenc Scientiam, не справилась с тем, как программу написать :)

    ОтветитьУдалить
  19. Annie, ты, безусловная умничка.
    Но к задача №5 я все же придерусь, ладно?)))
    Ты написала класс, который выводит на экран числа, квадрат которых равен введенному с клавиатуры числу.
    А надо -- чтобы программа писала "Да, есть такие" или "Нет, не найдено ни одного". То есть то, что она выводит на экран подходящие числа -- замечательно, но мало! ))
    И еще -- не обязательно "гнать" цикл до такого большого значения, можно ограничиться "до половины числа", например -- все равно во второй половине заведомо нет подходящих значений)))

    ОтветитьУдалить
  20. Annie, к задаче №6 те же придирки, что и к 5-й

    А вот в задаче №8 предлагаю и тебе, и ребятам провести эксперимент (все решено отлично, нет никаких замечаний): в if'е поменяйте местами первое и второе условие -- программа будет срываться.
    Догадаетесь, почему? )))

    ОтветитьУдалить
  21. А я при решении восьмой задачи как раз с этим сталкивалась. Может, потому что программа сначала делит (получается возможность деления на ноль) и лишь потом просматривает следующие условия, указывающие, что число нулю равно быть не должно?

    ОтветитьУдалить
  22. Ты абсолютно права! При использовании связки && сначала проверяется самое левое условие, затем -- второе, и так далее.
    Самое замечательное, что если одно условие не выполняется, остальные уже не проверяются совсем -- это нащывается "быстрый and". А если поставить на первое место проверку делимости -- до(!) првоерки на нулевое значение -- сбой.
    Молодец.

    ОтветитьУдалить