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

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

Восстановить пароль Регистрация
 
arreke
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 13
15.09.2012, 14:39     Задача: Необычные цифры #1
Описание

В математике имеются такие цифры, которые если умножить в квадрате, то в получившемся результате тоже будет эта цифра. Например: 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;
}
код работает, но не со всеми вариантами теста, на некоторых вариантах выдает не правильный результат.
подскажите, пожалуйста, что не так, или хотябы основные моменты этой задачи на которые надо особо обратить внимание...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
15.09.2012, 15:53     Задача: Необычные цифры #2
arreke, дайте ссылку на задачу.
На первый взгляд условие нечеткое:

Цитата Сообщение от arreke Посмотреть сообщение
В математике имеются такие цифры, которые если умножить в квадрате, то в получившемся результате тоже будет эта цифра. Например: 25x25=625,76x76=5776.
пишется про цифры, а пример приводят с числами.
И кстати в условии не сказано что начальное число должно быть обязательно в конце полученного числа. Может быть стоит проверять не только в конце.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
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
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
15.09.2012, 19:19     Задача: Необычные цифры #6
Именно в этом.
Yandex
Объявления
15.09.2012, 19:19     Задача: Необычные цифры
Ответ Создать тему
Опции темы

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