Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
arreke
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 13
#1

Задача: Необычные цифры - C++

15.09.2012, 14:39. Просмотров 976. Ответов 5
Метки нет (Все метки)

Описание

В математике имеются такие цифры, которые если умножить в квадрате, то в получившемся результате тоже будет эта цифра. Например: 25x25=625,76x76=5776. Напишите программу, которая определит такая это цифра, или нет.

Input

Вводим любое натуральное цисло.
Проверка будет повторяться пока не будет введена цифра 0.

Output

Вывести строку, которая состоит из 2 частей, первая - результат проверки цифры (Yes or No), вторая - квадрат введённой цифры.

Например, Input:
25↵
11↵
0↵

Output:
Yes 25*25=625↵
No 11*11=121↵

Мой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
 
int check(int n)
{  
    int n1, n2;
    n1=n; n2=n*n;
    while (n1>0) {
      //printf("%d %d\n", n1%10, n2%10);
      if (n1%10 != n2%10 ) return 0; 
      n1=n1/10; n2=n2/10;
    }
    return 1;  
} 
 
int main() {  
 
  int n;
  
  do {
    scanf("%d", &n); 
    if (n==0) continue; 
    
    if (check(n)==1) printf("Yes  %d*%d=%d\n", n, n, n*n);
    else printf("No  %d*%d=%d\n", n, n, n*n);
 
  } while (n!=0);
  
  return 0;
}
код работает, но не со всеми вариантами теста, на некоторых вариантах выдает не правильный результат.
подскажите, пожалуйста, что не так, или хотябы основные моменты этой задачи на которые надо особо обратить внимание...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2012, 14:39     Задача: Необычные цифры
Посмотрите здесь:

Задача:Определить повторяются Цифры в Числе или нет... C++
C++ Задача 56. Выяснить, какие цифры (по одной справа и слева) надо приписать к числу 1022,
C++ Задача: делить числа на отдельные цифры
C++ Необычные пользовательские интерфейсы
C++ задача: вывести цифры из матрицы по диагонали
C++ Задача( составить программу, которая определяет верно ли что в заданном числе все цифры стоят по возрастанию)
C++ Массив строк в с++. Вывести строки, в которых есть цифры. В каждой строке удалить все цифры
C++ Замена последней цифры на значение наименьшей цифры в записи числа N
C++ Даны цифры двух двузначных чисел. Получить цифры суммы
C++ Получить число М, которое образуется из числа N путем замены последней цифры на значение наибольшей цифры
Вывести сумму первой и третьей цифры и произведение второй и четвертой цифры числа, заданного пользователем C++
C++ Циклы: найти произведение последней цифры и минимальной цифры числа с произведением всех остальных

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4661 / 2487 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.09.2012, 15:53     Задача: Необычные цифры #2
arreke, дайте ссылку на задачу.
На первый взгляд условие нечеткое:

Цитата Сообщение от arreke Посмотреть сообщение
В математике имеются такие цифры, которые если умножить в квадрате, то в получившемся результате тоже будет эта цифра. Например: 25x25=625,76x76=5776.
пишется про цифры, а пример приводят с числами.
И кстати в условии не сказано что начальное число должно быть обязательно в конце полученного числа. Может быть стоит проверять не только в конце.
NoMasters
Псевдослучайный
1743 / 1086 / 71
Регистрация: 13.09.2011
Сообщений: 3,108
15.09.2012, 15:59     Задача: Необычные цифры #3
Есть пример данных, для которых выдаётся неверный ответ? Логика вроде бы в порядке, разве что стоит проверять возврат scanf и, если предполагается обрабатывать отрицательные значения, брать ввод по модулю перед передачей функции. Ну и n2 лучше объявить как long.
ober
Сообщений: n/a
15.09.2012, 18:25     Задача: Необычные цифры #4
напсал код, вроде все работает, проверяет не только в конце числа, а везде
ключевые моменты в комментариях:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
#include <math.h>
 
int count_digits(int n)
{
    int cnt = 1; 
 
    while (n /= 10)
        cnt++;
    return cnt;
}
 
/* checks if n2 is contained in the decimal notation of n1 */
int iscontained_in_dec(int n1, int n2) 
{
    int n1_nd = count_digits(n1);
    int n2_nd = count_digits(n2);
 
    int modulo = (int) 
        pow((double) 10, (double) n1_nd - 1);
    int div = (int)
        pow((double) 10, (double) n1_nd - n2_nd);
 
    if (n1_nd < n2_nd)
        return 0;
 
    /* go from left to right */
    while (div > 0) {
        /* divison by div cuts all excess digits from the right */
        if (n2 == n1 / div) 
            return 1;
        n1 %= modulo; /* cut digit from the left */
        modulo /= 10;
        div /= 10;
    }
    return 0;
}
 
int main()
{
    int n = 0;
 
    while (printf("enter n: ") > 0 && scanf("%d", &n) && n)
        printf("square: %d, %s\n", n * n, 
            iscontained_in_dec(n*n, n) ? "yes" : "no");
    return 0;
}
ну и я не стал заморачиваться с типами данных, везде сделал int
и случаи с кривыми входными данными тоже не учел, захотите - сделаете
arreke
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 13
15.09.2012, 19:08  [ТС]     Задача: Необычные цифры #5
Цитата Сообщение от valeriikozlov Посмотреть сообщение
arreke, дайте ссылку на задачу.
1. На первый взгляд условие нечеткое: пишется про цифры, а пример приводят с числами.
2. И кстати в условии не сказано что начальное число должно быть обязательно в конце полученного числа. Может быть стоит проверять не только в конце.
Условие на китайском, сам переводил, извиняюсь если где непонятно перевёл

По поводу второго пункта, изменил код, всё равно что то не так.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
 
int check(int n)
{  
    char str1[256], str2[246];
    char * pch;
    
    sprintf(str1, "%d", n);
    sprintf(str2, "%d", n*n);
    pch = strstr(str2, str1);
    if (pch) return 1;
    return 0;  
} 
 
int main() {  
 
  int n;
  
  do {
    scanf("%d", &n); 
    if (n==0) continue; 
    
    if (check(n)==1) printf("Yes  %d*%d=%d\n", n, n, n*n);
    else printf("No  %d*%d=%d\n", n, n, n*n);
 
  } while (n!=0);
  
  return 0;
}
Добавлено через 13 минут
Вот скрин с сайта универа, где я проверяю задачу, первый и третий пункт, зелёный, то есть скрипт выдаёт правильный результат, во втором пункте красный, то есть не правильно. http://pic.yupoo.com/908187460/CgJMdJoN/bk90o.jpg. Во втором и третьем пункте вводимые данные не показываются, поэтому не знаю что там происходит и где искать ошибку.

Добавлено через 7 минут
Цитата Сообщение от NoMasters Посмотреть сообщение
Ну и n2 лучше объявить как long.
625×625=390625
90625×90625=8212890625

когда ввожу 625 все правильно, а 90625 уже не может обработать, при умножении слишком большая цифра получается, может в этом дело?
NoMasters
Псевдослучайный
1743 / 1086 / 71
Регистрация: 13.09.2011
Сообщений: 3,108
15.09.2012, 19:19     Задача: Необычные цифры #6
Именно в этом.
Yandex
Объявления
15.09.2012, 19:19     Задача: Необычные цифры
Ответ Создать тему
Опции темы

Текущее время: 21:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru