К сожалению, из-за всяких форс-мажорных обстоятельств
пропало занятие с командой из Салавата – и очень жаль, команда больно толковая.
Попробую компенсировать это несколькими
симпатичными задачами.
Как всегда – всегда готовы к общению с вами
по поводу ваших решений.
Удачи!
Задание №1
Напишите класс, который принимает с клавиатуры
целое положительное пятизначное число и строит из него два новых числа (с
сохранением порядка цифр): одно – из четных цифр введенного числа, второе – из
нечетных. В случае, если введенное число содержит хоть один ноль – класс должен
выводить сообщение Нет решения и не строить описанные два числа.
Например: для числа 32564 следует построить
числа 264 и 35, а для числа 46308 – только вывести на экран сообщение Нет
решения.
Задание №2
Напишите класс, который принимает с клавиатуры
целое положительное число, не превышающее 99999, и строит из него новое число
методом "стирания нулей". Например, из числа 307 класс строит число
37, а из числа 24 – снова 24.
Задание №3
Напишите класс, который выводит на экран все
двузначные числа и рядом с каждым числом (в скобках) – количество делителей
этого числа.
Задание №4
Напишите класс, который принимает с клавиатуры
два числа, отвечающие следующим условиям:
Каждое из чисел – двузначное положительное
Первое число представляет собой числитель
простой дроби, второе – ее знаменатель
Дробь меньше единицы.
Класс должен проверять, можно ли привести
дробь к виду 1/n.
В случае, если введены числа, не
соответствующие указанным выше условиям, не следует проводить проверку, а надо
вывести на экран сообщение Не те данные.
Задание №5
Напишите класс, который выполняет задание №4
для всех вариантов дробей – то есть без ввода данных с клавиатуры.
Этот комментарий был удален автором.
ОтветитьУдалить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;
}}}
Annie, ты молодец!
ОтветитьУдалитьПрограмма твоя работает, все отлично, только внутренний цикл делает лишние проверки: можно написать for (j=1; j<=i; j++)
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);
}
}
}
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);
}
}
в данном варианте, 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++;
}
}
}
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");
}
}
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;
}}}
}
}
}
Задание 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);
}
}
Задание 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);
}
}
Задание 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("Не те данные.");
}
}
Задание 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+" ");
}
}
}
}
Я хочу обратить внимание всех участников и читателей на решения Сергея Познякова: при всей их сложности (излишней, на мой взгляд), они:
ОтветитьУдалить1-работают в смысле результата;
2-представляют прекрасный материал для самостоятельной работы в духе "а как бы это сделать попроще".
Комментарий на решение С.Познякова (задание 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);
}
}
}
Комментарий на решение 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);
}
}
Комментарий на решение задачи 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+") ");
}
}
}
Комментарий на задачу 4 (С.Позняков)
ОтветитьУдалить1) К сожалению, работает не всегда, например, когда первое число 12, а второе 16, на экран ничего не выводится! Мне кажется, что ты слегка перемудрил с проверками :)
2)В чем смысл проверки a1/b1<1? Если в том, чтобы убедиться, что a<b, так надо это и проверить.
3)И зачем вычисляем c1, если потом это значение не используется?
Комментарий на задачу 4 (AVV)
ОтветитьУдалитьХорошее, экономное решение, НО:
в условии сказано, что вводимые числа должны быть ДВУЗНАЧНЫМИ. Следовательно, попытка ввода не двузначного числа должна приводить к сообщению "Не те данные"
Комментарий к задаче 5.
ОтветитьУдалитьВо-первых, решение Сергея Познякова: ТРИ вложенных цикла - это, конечно, очень круто, но уж слишком!
Во-вторых, решение AVV: обрати внимание, что последняя из возможных пар (49, 98) у тебя не выводится!
А теперь общее замечание:
конечно, очень соблазнительно, взять решение 4 задачи и просто заменить ввод циклом, НО:
- а зачем прогонять первое число от 10 до 99, если понятно, что больше, чем 49 оно все равно быть не может?
- а зачем прогонять цикл для второго числа от 10 до 99, если понятно, что минимальное его значение это 2* (первое число)?
- а зачем вообще проверять, делится ли какое-то число на первое? Может, сразу выводить на экран удвоенное первое, потом утроенное...
Еще одно маленькое замечание к 5 задаче:
ОтветитьУдалить"лобовое" решение приводит к 90*90=8100 проверкам из которых только 104 дают положительный результат.
Аккуратное - к 104 выводам на экран.
Мы же хотим, чтобы наши программы работали не только правильно, но быстро...
Задача 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)+" ");
}
}
}
}
Вот до этого момента никто не говорил про то, что они должны работать быстро(да и медленность эта в таких масштабах не очень заметна).Но в следующий раз естественно постараюсь сделать с учетом всех выше перечисленных замечаний.По поводу не используемых переменных, скорее всего я просто забыл их убрать.
ОтветитьУдалитьЭтот комментарий был удален администратором блога.
ОтветитьУдалитьЭтот комментарий был удален администратором блога.
ОтветитьУдалитьПоправка к моему решению задания 4:
ОтветитьУдалитьСтрочку с условием
if((x2>x)&&(x2%x==0)&&(x>0)&&(x2>0))
следует поменять на
if((x2>x)&&(x2%x==0)&&(x>9)&&(x2<100))
К решению 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)+" ");
}
}
вот теперь, пожалуй, и все...
И чтобы уж "закруглить" тему, предлагаю вам подумать над такой задачей:
ОтветитьУдалитьвывести на экран все простые дроби, у которых числитель и знаменатель являются двузначными положительными числами (как в задачах 4-5), и которые НЕЛЬЗЯ УПРОСТИТЬ