четверг, 20 октября 2011 г.

Еще несколько симпатичных задач


К сожалению, из-за всяких форс-мажорных обстоятельств пропало занятие с командой из Салавата – и очень жаль, команда больно толковая.

Попробую компенсировать это несколькими симпатичными задачами.

Как всегда – всегда готовы к общению с вами по поводу ваших решений.

Удачи!


Задание №1
Напишите класс, который принимает с клавиатуры целое положительное пятизначное число и строит из него два новых числа (с сохранением порядка цифр): одно – из четных цифр введенного числа, второе – из нечетных. В случае, если введенное число содержит хоть один ноль – класс должен выводить сообщение Нет решения и не строить описанные два числа.
Например: для числа 32564 следует построить числа 264 и 35, а для числа 46308 – только вывести на экран сообщение Нет решения.

Задание №2
Напишите класс, который принимает с клавиатуры целое положительное число, не превышающее 99999, и строит из него новое число методом "стирания нулей". Например, из числа 307 класс строит число 37, а из числа 24 – снова 24.

Задание №3
Напишите класс, который выводит на экран все двузначные числа и рядом с каждым числом (в скобках) – количество делителей этого числа.

Задание №4
Напишите класс, который принимает с клавиатуры два числа, отвечающие следующим условиям:
Каждое из чисел – двузначное положительное
Первое число представляет собой числитель простой дроби, второе – ее знаменатель
Дробь меньше единицы.
Класс должен проверять, можно ли привести дробь к виду 1/n.
В случае, если введены числа, не соответствующие указанным выше условиям, не следует проводить проверку, а надо вывести на экран сообщение Не те данные.

Задание №5
Напишите класс, который выполняет задание №4 для всех вариантов дробей – то есть без ввода данных с клавиатуры.

27 комментариев:

  1. Этот комментарий был удален автором.

    ОтветитьУдалить
  2. import java.util.*;
    class Zadanie_3
    {static Scanner reader = new Scanner (System.in);
    public static void main (String [] args)
    {int n,j,i;
    n=0;
    for (i = 10; i<=99; i++)
    {
    for (j=1; j<=99; j++)
    {
    if (i%j==0) n++;
    }
    System.out.print (i+" "+"("+n+") ");
    n=0;
    }}}

    ОтветитьУдалить
  3. Annie, ты молодец!
    Программа твоя работает, все отлично, только внутренний цикл делает лишние проверки: можно написать for (j=1; j<=i; j++)

    ОтветитьУдалить
  4. import java.util.*;
    class n1
    {
    static Scanner reader=new Scanner(System.in);
    public static void main(String []args)
    {
    int a,a1,a2,a3,a4,a5,i1,i2,n1,n2,b1,b2;
    boolean c1,c2,c3,c4,c5;
    i1=0;i2=0;b1=0;b2=0;
    a=reader.nextInt();
    a1=a/10000;
    a2=a/1000%10;
    a3=a/100%10;
    a4=a/10%10;
    a5=a%10;
    if((a1==0)||(a2==0)||(a3==0)||(a4==0)||(a5==0)) System.out.print("Нет решения"); else
    {
    if(a1%2==0) {i1++;c1=true; } else {i2++;c1=false; };
    if(a2%2==0) {i1++;c2=true; } else {i2++;c2=false; };
    if(a3%2==0) {i1++;c3=true; } else {i2++;c3=false; };
    if(a4%2==0) {i1++;c4=true; } else {i2++;c4=false; };
    if(a5%2==0) {i1++;c5=true; } else {i2++;c5=false; };
    n1=(int)Math.pow(10,(i1-1));
    n2=(int)Math.pow(10,(i2-1));
    if(n1==0) b1=0; else {
    if(c1==true) {b1=b1+a1*n1; n1/=10; }
    if(c2==true) {b1=b1+a2*n1; n1/=10; }
    if(c3==true) {b1=b1+a3*n1; n1/=10; }
    if(c4==true) {b1=b1+a4*n1; n1/=10; }
    if(c5==true) {b1=b1+a5*n1; n1/=10; } }
    if(n2==0) b2=0; else {
    if(c1==false) {b2=b2+a1*n2; n2/=10; }
    if(c2==false) {b2=b2+a2*n2; n2/=10; }
    if(c3==false) {b2=b2+a3*n2; n2/=10; }
    if(c4==false) {b2=b2+a4*n2; n2/=10; }
    if(c5==false) {b2=b2+a5*n2; n2/=10; } }
    System.out.println(b1);
    System.out.println(b2);
    }
    }
    }

    ОтветитьУдалить
  5. import java.util.*;
    class n2
    {
    static Scanner reader=new Scanner(System.in);
    public static void main(String []args)
    {
    int a,a1,a2,a3,a4,a5,i,b,n;
    a=reader.nextInt();
    a1=a/10000;
    a2=a/1000%10;
    a3=a/100%10;
    a4=a/10%10;
    a5=a%10;
    i=0;b=0;
    if(a1!=0) i++;
    if(a2!=0) i++;
    if(a3!=0) i++;
    if(a4!=0) i++;
    if(a5!=0) i++;
    n=(int)Math.pow(10,(i-1));
    if(a1!=0) { b+=a1*n; n/=10; } ;
    if(a2!=0) { b+=a2*n; n/=10; } ;
    if(a3!=0) { b+=a3*n; n/=10; } ;
    if(a4!=0) { b+=a4*n; n/=10; } ;
    if(a5!=0) { b+=a5*n; n/=10; } ;
    System.out.println(b);
    }
    }

    ОтветитьУдалить
  6. в данном варианте, 1 считается делителем числа, а само число нет.
    import java.util.*;
    class n3
    {
    static Scanner reader=new Scanner(System.in);
    public static void main(String []args)
    {
    int a,i,b,i1;
    a=10;
    for(i=1;i<=90;i++)
    {
    b=0;
    for(i1=1;i1<=a/2;i1++)
    if(a%i1==0) b++;
    System.out.print(a+"("+b+") ");
    a++;
    }
    }
    }

    ОтветитьУдалить
  7. import java.util.*;
    class n4
    {
    static Scanner reader=new Scanner(System.in);
    public static void main(String []args)
    {
    int a,b,d,d1;
    double a1,b1,c1,i1;
    d=0;d1=0;
    a=reader.nextInt();
    b=reader.nextInt();
    if(((a>=10)&&(a<=99))&&((b>=10)&&(b<=99)))
    {
    a1=a;
    b1=b;
    c1=a1/b1;
    if(a1/b1<1)
    {
    if(b%a==0) { System.out.print("Дробь равна 1/"+(b/a));d1=1; }
    }
    else
    System.out.print("Не те данные");
    }
    else
    System.out.print("Не те данные");
    if((d==1)&&(d1!=1)) System.out.print("Дробь нельзя привести к виду 1/n");
    }
    }

    ОтветитьУдалить
  8. import java.util.*;
    class n5
    {
    static Scanner reader=new Scanner(System.in);
    public static void main(String []args)
    {
    int a,b,i,d,d1;
    double a1,b1,c,c1,i1;
    d=0;d1=0;a=0;b=0;

    for(a=10;a<=99;a++)
    {
    for(b=10;b<=99;b++)
    {
    a1=a;
    b1=b;
    c1=a1/b1;
    if(a1/b1!=1)
    {
    for(i=1;i<=99;i++)
    {
    i1=i;
    c=1/i1;
    if(c==c1) { System.out.println("Дробь"+a+"/"+b+" равна 1/"+i);d1=1; }
    else d=1;
    }}}
    }
    }
    }

    ОтветитьУдалить
  9. Задание 1:
    import java.util.*;
    class c1
    {
    static Scanner r=new Scanner(System.in);
    public static void main(String[] args)
    {
    int s=0,b=1,b2=1,x=0,x2=0;
    int n=r.nextInt();
    for(int i=1;i<10001;i=i*10)
    {
    if((n/i)%10!=0)
    {
    if(((n/i)%10)%2==0)
    {
    x=x+((n/i)%10)*b;
    b=b*10;
    }
    else
    {
    x2=x2+((n/i)%10)*b2;
    b2=b2*10;
    }
    }
    else
    s=1;
    }
    if(s==1)
    System.out.println("Нет решения.");
    System.out.println(x+" "+x2);
    }
    }

    ОтветитьУдалить
  10. Задание 2:
    import java.util.*;
    class c2
    {
    static Scanner r=new Scanner(System.in);
    public static void main(String[] args)
    {
    int b=1,x=0;
    int n=r.nextInt();
    for(int i=1;i<100001;i=i*10)
    {
    if((n/i)%10!=0)
    {
    x=x+((n/i)%10)*b;
    b=b*10;
    }
    }
    System.out.println(x);
    }
    }

    ОтветитьУдалить
  11. Задание 4:
    import java.util.*;
    class c4
    {
    static Scanner r=new Scanner(System.in);
    public static void main(String[] args)
    {
    int x=r.nextInt();
    int x2=r.nextInt();
    if((x2>x)&&(x2%x==0)&&(x>0)&&(x2>0))
    System.out.println("Можно, 1/"+x2/x);
    else
    System.out.println("Не те данные.");
    }
    }

    ОтветитьУдалить
  12. Задание 5:
    import java.util.*;
    class c5
    {
    static Scanner r=new Scanner(System.in);
    public static void main(String[] args)
    {
    for(int x=10;x<99;x++)
    {
    for(int x2=10;x2<98;x2++)
    {
    if((x2>x)&&(x2%x==0))
    System.out.print(x+"/"+x2+" ");
    }
    }
    }
    }

    ОтветитьУдалить
  13. Я хочу обратить внимание всех участников и читателей на решения Сергея Познякова: при всей их сложности (излишней, на мой взгляд), они:
    1-работают в смысле результата;
    2-представляют прекрасный материал для самостоятельной работы в духе "а как бы это сделать попроще".

    ОтветитьУдалить
  14. Комментарий на решение С.Познякова (задание 1)
    Если уж мы разложили пятизначное число на цифры (то, что называется "в лоб"), так и продолжать можно по каждой цифре в отдельности, например, так:
    class n1
    {
    static Scanner reader=new Scanner(System.in);


    public static void main(String []args)
    {


    int a=reader.nextInt();
    int a1=a/10000;
    int a2=a/1000%10;
    int a3=a/100%10;
    int a4=a/10%10;
    int a5=a%10;
    if((a1==0)||(a2==0)||(a3==0)||(a4==0)||(a5==0)) System.out.println("No solution");
    else
    {
    int b1=0;
    int b2=0;
    if(a1%2==0)b1=b1*10+a1;
    else b2=b2*10+a1;
    if(a2%2==0)b1=b1*10+a2;
    else b2=b2*10+a2;
    if(a3%2==0)b1=b1*10+a3;
    else b2=b2*10+a3;
    if(a4%2==0)b1=b1*10+a4;
    else b2=b2*10+a4;
    if(a5%2==0)b1=b1*10+a5;
    else b2=b2*10+a5;

    System.out.println(b1);
    System.out.println(b2);
    }
    }
    }

    ОтветитьУдалить
  15. Комментарий на решение AVV (задание 1)
    Очень симпатичная идея использовать цикл для выделения отдельных цифр. Молодец! Есть только одна проблема: в задание подчеркнуто, что если есть нули, то НЕ НАДО строить новые числа,а просто напечать сообщение об отсутствии решения. На самом деле, данное уточнение приводит к дополнительной работе - вначале проверить, что нет нулей, а затем снова разбивать число на цифры и строить новые. Если же делать это параллельно (как ты и сделал), то экономится время. Я позволил себе чуть-чуть изменить твою программу с целью сделать ее более понятной. Обрати внимание на цикл!
    class c1
    {
    static Scanner r=new Scanner(System.in);
    public static void main(String[] args)
    {

    int s=0;
    int x=0,x2=0;
    int n=r.nextInt();
    for(int i=10000;i>0;i=i/10)
    {
    int digit=n/i%10;
    if(digit==0)s=1;
    else
    {
    if(digit%2==0)x=x*10+digit;
    else x2=x2*10+digit;
    }
    }
    if(s==1)
    System.out.println("No solution.");
    else
    System.out.println(x+" "+x2);
    }

    }

    ОтветитьУдалить
  16. Комментарий на решение задачи 3 (С.Позняков)
    Все хорошо, только зачем было вводить дополнительную переменную а?
    class n3
    {
    static Scanner reader=new Scanner(System.in);
    public static void main(String []args)
    {
    int a,i,b,i1;

    for(i=10;i<=99;i++)
    {
    b=0;
    for(i1=1;i1<=i/2;i1++)
    if(i%i1==0) b++;
    System.out.print(i+"("+b+") ");

    }
    }
    }

    ОтветитьУдалить
  17. Комментарий на задачу 4 (С.Позняков)
    1) К сожалению, работает не всегда, например, когда первое число 12, а второе 16, на экран ничего не выводится! Мне кажется, что ты слегка перемудрил с проверками :)

    2)В чем смысл проверки a1/b1<1? Если в том, чтобы убедиться, что a<b, так надо это и проверить.
    3)И зачем вычисляем c1, если потом это значение не используется?

    ОтветитьУдалить
  18. Комментарий на задачу 4 (AVV)
    Хорошее, экономное решение, НО:
    в условии сказано, что вводимые числа должны быть ДВУЗНАЧНЫМИ. Следовательно, попытка ввода не двузначного числа должна приводить к сообщению "Не те данные"

    ОтветитьУдалить
  19. Комментарий к задаче 5.
    Во-первых, решение Сергея Познякова: ТРИ вложенных цикла - это, конечно, очень круто, но уж слишком!
    Во-вторых, решение AVV: обрати внимание, что последняя из возможных пар (49, 98) у тебя не выводится!
    А теперь общее замечание:
    конечно, очень соблазнительно, взять решение 4 задачи и просто заменить ввод циклом, НО:
    - а зачем прогонять первое число от 10 до 99, если понятно, что больше, чем 49 оно все равно быть не может?
    - а зачем прогонять цикл для второго числа от 10 до 99, если понятно, что минимальное его значение это 2* (первое число)?
    - а зачем вообще проверять, делится ли какое-то число на первое? Может, сразу выводить на экран удвоенное первое, потом утроенное...

    ОтветитьУдалить
  20. Еще одно маленькое замечание к 5 задаче:
    "лобовое" решение приводит к 90*90=8100 проверкам из которых только 104 дают положительный результат.
    Аккуратное - к 104 выводам на экран.

    Мы же хотим, чтобы наши программы работали не только правильно, но быстро...

    ОтветитьУдалить
  21. Задача 5 с поправками:
    class c5
    {
    public static void main(String[] args)
    {
    for(int x=10;x<50;x++)
    {
    for(int x2=2;x2<10;x2++)
    {
    if((x*x2)<99)
    System.out.print(x+"/"+(x*x2)+" ");
    }
    }
    }
    }

    ОтветитьУдалить
  22. Вот до этого момента никто не говорил про то, что они должны работать быстро(да и медленность эта в таких масштабах не очень заметна).Но в следующий раз естественно постараюсь сделать с учетом всех выше перечисленных замечаний.По поводу не используемых переменных, скорее всего я просто забыл их убрать.

    ОтветитьУдалить
  23. Этот комментарий был удален администратором блога.

    ОтветитьУдалить
  24. Этот комментарий был удален администратором блога.

    ОтветитьУдалить
  25. Поправка к моему решению задания 4:
    Строчку с условием
    if((x2>x)&&(x2%x==0)&&(x>0)&&(x2>0))
    следует поменять на
    if((x2>x)&&(x2%x==0)&&(x>9)&&(x2<100))

    ОтветитьУдалить
  26. К решению 5 задачи
    Отлично, и еще чуть-чуть:
    во внутреннем цикле можно изменить заголовок и тогда отпадает необходимость в проверке внутри цикла:
    public static void main(String[] args)
    {
    for(int x=10;x<50;x++)
    {
    for(int x2=2;x*x2<99;x2++)
    {
    System.out.print(x+"/"+(x*x2)+" ");
    }
    }
    вот теперь, пожалуй, и все...

    ОтветитьУдалить
  27. И чтобы уж "закруглить" тему, предлагаю вам подумать над такой задачей:
    вывести на экран все простые дроби, у которых числитель и знаменатель являются двузначными положительными числами (как в задачах 4-5), и которые НЕЛЬЗЯ УПРОСТИТЬ

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