Задача.
Получить таблицу пересчета миль в километры и обратно (1 миля=1,609344 км) для расстояний,не превышающих k км, в следующем виде:
мили | км |
0,6214 | 1,0000 |
1,0000 | 1,6093 |
1,2428 | 2,0000 |
1,8641 | 3,0000 |
2,0000 | 3,2187 |
Тесты.
Ввод | Вывод |
k | |
3 | mile km 0.6214 1.0000 1.0000 1.6093 1.2427 2.0000 1.8641 3.0000 |
7 | mile km 0.6214 1.0000 1.0000 1.6093 1.2427 2.0000 1.8641 3.0000 2.0000 3.2187 2.4855 4.0000 3.0000 4.8280 3.1069 5.0000 3.7282 6.0000 4.0000 6.4374 4.3496 7.0000 |
0 | mile km |
3.3 | mile km 0.6214 1.0000 1.0000 1.6093 1.2427 2.0000 1.8641 3.0000 2.0000 3.2187 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> #include <math.h> using namespace std; int main() { double n=1,k; scanf("%lf ",&k); printf("mile km\n"); for(double i=1;i<=ceil(k);i++) { if(i/1.609344<n)printf("%.4f %.4f\n",i/1.609344,i); else { if(n*1.609344<=k)printf("%.4f %.4f\n",n,n*1.609344); if(i<=k)printf("%.4f %.4f\n",i/1.609344,i); n++; } } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) { Scanner in = new Scanner(System.in); double n = 1,k = in.nextDouble(); System.out.println("mile km"); for(double i = 1;i <= Math.ceil(k);i++) { if(i / 1.609344 < n) System.out.format("%.4f %.4f\n", i / 1.609344, i); else { if(n * 1.609344 <= k) System.out.format("%.4f %.4f\n", n, n * 1.609344); if(i <= k) System.out.format("%.4f %.4f\n", i / 1.609344, i); n++; } } } } |
Решение.
Читаем значение k. В цикле имеем два значения n и i, значение i увеличиваем в каждом витке цикла, а значение n тогда, когда значение [latex]i/1.609344[/latex] превысит значение n. Пока этого не произошло печатаем значения соответствующие i км и [latex]i/1.609344[/latex] милям. Когда-же значение [latex]i/1.609344[/latex] превысило значение n проверяем, если значение [latex]n\times 1.609344[/latex] меньше или равно k печатаем строку, где значения миль равно n, а значение км [latex]n\times 1.609344[/latex], потом проверяем если значение i меньше или равно значению k, то печатаем строку, где значение миль равно[latex]i/1.609344[/latex], а значение км равно i. То есть для подсчёта целых значений миль используем параметр n, а для подсчёта целых значений км параметр i.
Основная ошибка в неправильно понятом условии. Необходимо сгенерировать таблицу в которой присутствуют все целые значения в километрах (до k километров включительно) и все целые значения в милях, не превышающие k километров. Из потока вводится только k.
Как следствие никаких 2,0001. Нужно как в задачнике 2,0000. При необходимости можно поправить правый столбец. Но 2 мили должны обязательно присутствовать.
— Добавьте в метки мили и километры.
— Сделайте ссылку на ideone «кликабельной».
— Код стал гораздо лучше. Но снова ошибка. Если k = 3.3, то должны быть напечатаны все значения из первой таблицы. А печатается без последней строки. Исправьте, пожалуйста.
Кстати, я чуть иначе решал бы. Постарался сделать решение симметричным относительно миль и километров, чтобы годилось для любых коэффициентов пересчёта. Но это не важно. Доведите до ума свой код.
Зачтено 7 баллов.
Недочёт — 5 раз использовали волшебное число. Следовало завести именованную константу.
Почему снова волшебные числа? То, что год назад было недочётом теперь уже просто ошибка.