2013-11-17 2 views
0

Напишите программу, в которой будут выводиться все номера определенного диапазона, которые могут быть разделены на их сумму и произведение их четных позиций. Между тем, если есть 0 на четном месте, игнорировать его. Я написал программу ниже, но, похоже, она рушится, когда она запускалась по какой-то причине. Нет ошибок, программы работают нормально, затем я ввожу диапазон, и он сбой.Проверьте, является ли сумма/произведение цифр в четном положении числом

#include <iostream> 

using namespace std; 

int zbirparnicifri(int x); 
int proizparnicifri(int x); 

int main() 
{ 
    int x, y, br = 0; 
    cin >> x >> y; 

    for (int i = x; i <= y; i++){ 
     int proizcif = proizparnicifri(i); 
     int zbircif = zbirparnicifri(i); 
     if(zbircif != 0 && proizcif != 0){ 
      if (i % proizcif == 0 && i % zbircif == 0){ 
       cout << i << endl; 
       br++; 
      } 
     } 
    } 

    return 0; 
} 

int zbirparnicifri(int x) 
{ 
    int sum = 0; 
    while(x > 0){ 
     if (x % 100 != 0) 
      sum += x % 100; 
     x /= 100; 
    } 
    return sum; 
} 

int proizparnicifri(int x) 
{ 
    int proiz = 1; 
    while(x > 0){ 
     if (x % 100 != 0) 
      proiz *= x % 100; 
     x /= 100; 
    } 
    return proiz; 
} 
+1

Оператор% - это деление, возвращает остаток. Вы можете делиться на ноль. –

+0

Спасибо, кажется, исправляет проблему, однако мое решение недостаточно для проверки «четных» позиций чисел без использования массивов. – user3002211

+0

Можете ли вы рассчитать цифры от let, скажем, диапазон от 0 до 20, который вы хотите, чтобы ваша программа была в списке, может сделать вещи немного яснее. –

ответ

2

Добро пожаловать в переполнение стека. Вы не можете ожидать, что сообщество отлаживает вашу программу, если вы не продемонстрируете честную попытку попробовать что-то самостоятельно. Например, вы пытались добавить некоторые инструкции print/cout, чтобы узнать, в какую строку врезалась ваша программа (и значение некоторых переменных)? Вы пробовали пройти через отладчик.

Поскольку я в хорошем настроении, давайте посмотрим, что говорит отладчик ...

[email protected] ~ $ gdb a.out 
GNU gdb (GDB) 7.5-ubuntu 
Copyright (C) 2012 Free Software Foundation, Inc.... 
Reading symbols from /home/jselbie/a.out...done. 
(gdb) run 
Starting program: /home/jselbie/a.out 
10 
20 

Program received signal SIGFPE, Arithmetic exception. 
0x00000000004009f5 in main() at foo.cpp:17 
17   if (i % proizcif == 0 && i % zbircif == 0){ 
(gdb) print i 
$1 = 10 
(gdb) print proizcif 
$2 = 0 
(gdb) print zbircif 
$3 = 0 

Так что вы идете - «proizcif» равна нулю. Также как zbifcif равен нулю. Таким образом, он вылетает по строке 17, пытаясь вычислить «i% 0»

+0

Уже исправлена ​​эта проблема. Спасибо за Берегись! :) – user3002211

+2

@ user3002211 - В следующий раз, когда ваша программа выйдет из строя (или не работает), пожалуйста, приложите честные усилия, чтобы отладить ее самостоятельно. – selbie

+0

Простите, я действительно не думал о такой ошибке, но я обязательно буду проверять в следующий раз, прежде чем спрашивать. Еще раз спасибо :) – user3002211

Смежные вопросы