2015-07-30 2 views
-3

Определим поездку через число, которое будет построено следующим образом: Посетите самую левую цифру числа. Эта цифра указывает вам, какую цифру следует посетить следующей: перемещайтесь вправо, при необходимости обертывая в левом конце номера, столько же мест, сколько значение цифры. Продолжайте этот процесс, пока какая-то цифра не будет посещена во второй раз. Если все цифры были посещены, число соответствует числу оберток. В противном случае это не так., чтобы определить номер обертывания

Например, рассмотрите номер 32741. Мы посетим самую левую цифру, которая говорит нам, чтобы следующий раз посетил цифру три места справа, которая является 4. Затем мы посетим 7 (который находится в четырех местах справа от 4), затем 1, затем 3. Поездка вернулась к цифре во второй раз, не посетив все цифры. (2 никогда не посещался.) Таким образом, 32741 не является обертыванием числа. С другой стороны, 3233 - это обертка вокруг номера, так как мы сначала посетим крайний левый 3, затем самый правый 3, затем средний 3, затем 2, а затем вернемся в крайнее правое 3. Все четыре цифры посещаются.


Напишите программу, которая принимает в качестве входных данных положительного числа и отчеты ли это или нет обертка вокруг числа.

Формат ввода:

Input consists of a single positive number. 

Успенская

Assume that the input number is less than or equal to 400000000. 

Формат вывода:

Refer sample output for formatting details. 

Пример ввода 1:

872 

Пример вывода 1:

872 is a wraparound number 

Пример ввода 2:

351267813 

Пример вывода 2:

351267813 is not a wraparound number. 

Вот мой program..it показывает неправильный вывод для ввода образца 1 и rigt для ввода образца 2.

#include<stdio.h> 
int main() 
{ 
    int a[9],number; 
    scanf("%d",&number); 
    int i; 
    for(i=0;i<9;i++) 
    { 
    a[i]=-1; 
    } 
    int temp=0,digit=0,index=0; 
    temp=number; 
    while(temp!=0) 
    { 
    digit=(temp%10); 
    a[index]=digit; 
    index=index+1; 
    temp=temp/10; 
    } 
    int size=0,checksize=-1; 
    i=0; 
    for(i=0;i<9;i++) 
    { 
    if(a[i]==-1) 
    { 
     size=i; 
     checksize=0; 
     break; 
    } 
    } 
    if(checksize==-1) 
    size=9; 
    int isAWrapAround=0; 
    int x=0,count=size-1,remaining=0,arraysize=size; 
    for(i=(arraysize-1);i>=0;i--) 
    { 
    x=a[count]; 
    a[count]=-1; 
    if(x!=-1) 
    { 
     if(count-x>=0) 
     { 
     count=count-x; 
     } 
     else 
     { 
     remaining=x-count; 
     count=0; 
     do 
     { 
      if(remaining<=arraysize) 
      { 
      count=arraysize-remaining; 
      break; 
      } 
      else 
      { 
      count=remaining-arraysize; 
      remaining=remaining-arraysize; 
      } 
     } 
     while(count>arraysize-1); 
     } 
    } 
    else 
    { 
     isAWrapAround=-1; 
    } 
    } 
    if(isAWrapAround==0) 
    { 
     printf("%i is a wraparound number",number); 
    } 
    else 
    { 
     printf("%i is not a wraparound number",number); 
    } 
    return 0; 
    } 

удалось выяснить ошибку.

+4

Что вы узнали, когда вы перешли через программу в своем отладчике? – Sneftel

+0

@sneftel не подтверждается для данного входного значения «872», но работает для «351267813» – 620d

+1

Добро пожаловать в Stack Overflow! Пройдите [tour] (http://stackoverflow.com/tour) и прочитайте [Как спросить] (http://stackoverflow.com/help/how-to-ask), чтобы узнать, чего мы ожидаем от вопросов здесь. –

ответ

-1

просто написал простой код, который демонстрирует, как я решил проблему. Возьмите некоторые идеи и улучшите свое. Cheers

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 
#include <stdbool.h> 

//! Max amount of digits in input value 
#define maxInputDigits 9 

//! Highest input value 
static const uint32_t maxInputValue = 400000000; 

int main() 
{ 
    uint32_t inputValue; 
    uint8_t digitValue[maxInputDigits], tmpDigitValue[maxInputDigits]; 
    uint8_t nrOfDigits = 0; 
    bool digitVisit[maxInputDigits] = {false, false, false, false, false, false, false, false, false}; 

    uint32_t dividend = 10; 
    uint32_t divisor; 

    uint8_t cnt; 
    uint8_t index; 
    uint8_t jumps; 


    // Get input from user 
    scanf("%d", &inputValue); 

    // Input valid? 
    if (inputValue > maxInputValue) 
    { 
     printf("Input value condition: <= %d", maxInputValue); 
    } 


    // Separate all digits from input value into its own index 
    divisor = inputValue; 

    while(divisor != 0) 
    { 
     tmpDigitValue[nrOfDigits] = (divisor % dividend)/(dividend/10); 
     divisor /= 10; 

     nrOfDigits++; 
    } 


    // Reverse the order, so that the least digit becomes left most in the array (digitValue[0]) 
    for (cnt = 0; cnt < nrOfDigits; cnt++) 
    { 
     digitValue[cnt] = tmpDigitValue[(nrOfDigits-1)-cnt]; 
    } 

    printf("Nr of digits: %d\n\n\n", nrOfDigits); 


    // Set the start index (left most) 
    index = 0; 

    // Start the process 
    while (true) 
    { 
     printf("Current value[index]: %d[%d]\n",digitValue[index], index); 
     // Already been checked? 
     if (digitVisit[index] == true) 
     { 
      break; 
     } 
     else 
     { 
      digitVisit[index] = true; 
     } 

     // Amount of jumps 
     jumps = digitValue[index]; 

     // Jump to next index 
     while (jumps > 0) 
     { 
      index = (index >= (nrOfDigits - 1)) ? 0 : (index + 1); 
      jumps--; 
     } 

    } 


    // Check if any of the digits has not been visited 
    for (cnt = 0; cnt < nrOfDigits; cnt++) 
    { 
     if (digitVisit[cnt] == false) 
     { 
      printf("\n%d is not a wraparound number\n", inputValue); 
      return 0; 
     } 
    } 

    printf("%d is a wraparound number\n", inputValue); 

    return 0; 
} 
+0

спасибо @ezFreak .. :) – 620d

+0

Некоторая обратная связь о том, почему она будет уменьшена, будет оценена по достоинству. Всегда хорошо с некоторой обратной связью :) Спасибо – ezFreak

+0

i dint downvoted ur answer..i попытался дать ему + 1..bt его nt work..это в любом случае .. ваша программа работала на меня, и за это я действительно благодарен вам , :) – 620d

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