Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Вывести числа на экран


Автор: Япончик 12.11.2005, 21:01
По СИ задача такая:
Вывести на экран все пятизначные числа, состоящие из несовпадающих цифр.
smile

Автор: darkart 12.11.2005, 21:49
Где-то так...
Код

#include<stdio.h>
int main()
{
int i1,i2,i3,i4,i5;
for(i1=1;i1<10;i1++)
  for(i2=0;i2<10;i2++)
    if(i1!=i2)
      for(i3=0;i3<10;i3++)
        if(i3!=i1&&i3!=i2)
          for(i4=0;i4<10;i4++)
            if(i4!=i1&&i4!=i2&&i4!=i3)
              for(i5=0;i5<10;i5++)  
                 if(i5!=i1&&i5!=i2&&i5!=i3&&i5!=i4)
                   printf("%d%d%d%d%d ",i1,i2,i3,i4,i5);
  return 0;
}

Автор: nikitao 12.11.2005, 22:06
Или более универсальное решение
Код

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
bool initilizator(char *str);
int main(void)
{
    long i;
    char a[6];
    for (i=10000;i<100000;i++)
    {
        itoa(i,a,10);
        if(initilizator(a))printf("%d ",i);
    }
    getch();
    return 0;
}
bool initilizator(char *str)
{
    int i,j;
    int len=strlen(str);
    for (i=0;i<len;i++)
    {
        for (j=i+1;j<len;j++)
            if (str[i]==str[j])return false;
    }
    return true;
}

Подходит не только для 5тизначных,но идля любых чисел(если поменять одну цифру в коде) smile

Автор: LSD 12.11.2005, 22:09
darkart в твоем примере будут выведены числа у которых для цифр выполняется неравенство a1 < a2 < a3 < a4 < a5 и например число 98765 выведено не будет, а по условию задачи должно.

Во внутреннем цикле надо еще перебрать все возможные перестановки из этих чисел.

Автор: darkart 12.11.2005, 22:13
Цитата
darkart в твоем примере будут выведены числа у которых для цифр выполняется неравенство a1 < a2 < a3 < a4 < a5 и например число 98765 выведено не будет, а по условию задачи должно.

Уже исправил.

Автор: Rick 13.11.2005, 14:34
а как насчет 39145 и пр.

Автор: LSD 13.11.2005, 15:01
Цитата(Rick @ 13.11.2005, 14:34)
а как насчет 39145 и пр.

Проверь smile

Автор: sergejzr 13.11.2005, 15:40
Ребята, цикл в цикле не только сотрятся запутанно и читаются тяжело, это так же является свидетельством того, что проблему решали не задумываясь над ней smile
предложу и своё решение smile

Код

#include "iostream.h"
int matrix[10]; //матрица, условно содержащая цифры 0-9

bool check(int num,int _switch)
{
    
    for(;num>0;num/=10) //идём, цифра за цифрой
    { 
        int cifra=num%10; 
        if(matrix[cifra]!=_switch) //проверка, отмечена ли цифра в матрице
        {
            matrix[cifra]=_switch;//цифры небыло, отметим
        }
        else return false; //цифра была, прекращаем цикл
    }  
  
return true;
}

int main()
{
 int _switch=1;
 //начальная инициализация. Все числа - 0
 for(int i=0;i<9;i++) matrix[i]=0;
    
 for(int num=10000;num<19999;num++,_switch++) //_switch необходимо увеличивать, чтобы значения матрицы всегда были разными
 {
  if(check(num,_switch)) cout<<num<<" "; //здесь всё ясно :) 
 }
    return 0;
}

Автор: darkart 13.11.2005, 15:51
Для проверки, открой файл созданный вот этим и поищи
Цитата
а как насчет 39145

Код

#include<stdio.h>
int main()
{
  const int n=10;
  FILE* f;
  int i1,i2,i3,i4,i5,num;
  f=fopen("output.txt","w");
  for(i1=1;i1<n;i1++)
    for(i2=0;i2<n;i2++)
      if(i1!=i2)
        for(i3=0;i3<n;i3++)
          if(i3!=i1&&i3!=i2)
            for(i4=0;i4<n;i4++)
              if(i4!=i1&&i4!=i2&&i4!=i3)
                for(i5=0;i5<n;i5++)  
                  if(i5!=i1&&i5!=i2&&i5!=i3&&i5!=i4)
                  {
                    num=i1*10000+i2*1000+i3*100+i4*10+i5;
                    printf("%d ",num);
                    fprintf(f,"%d\n",num);                            
                  }
  fclose(f);
  return 0;
}

Автор: nikitao 13.11.2005, 16:45
sergej.z,почему нежилательно вкладывать циклы?(ИМХО)Если этим не злоупотреблять(как у меня) и коменты добовлять ,то нормальный код выйдет.Надо было на C реализавать(ну это мелачь) и в 26 строчке кода должно быть num<99999

Проблемка в другом:если откомпилить все проги,то результат выйдет начиная с числа 65907(уж больно много чисел,консоль не справляется),есть ли красивое решение этой проблемы???

Автор: sergejzr 13.11.2005, 17:00
Цитата(nikitao @ 13.11.2005, 15:45)
почему нежилательно вкладывать циклы?

Потому что это алгоритмическое убийство. Решение влоб перебором. Оценка не зависит от того, работает или не работает, но от того, сколько ты думал о проблеме, понял ли её досконально.

Красивое решение - в файл. Или ГУЙ рисуй со сроллбаром smile

Автор: S.A.P. 13.11.2005, 17:22
Вот мое решение:
Код

#include <iostream>
#include <conio.h>

using namespace std;

char number_set[10] = {0,1,2,3,4,5,6,7,8,9};
bool ban_set[10] = {false};


void print_perm( int depth, int cur_number )
{
    if ( depth <= 0 ){
        cout << cur_number << endl; 
        return;
    }
    
    for ( int i = 0; i < 10; i++ )
        if ( !ban_set[i] ) {
            ban_set[i] = true;
            print_perm( depth - 1, cur_number * 10 + number_set[i] );
            ban_set[i] = false;
        }
}            

int main(int argc, char *argv[])
{
    print_perm( 5, 0 );
    getch();
}

Автор: sergejzr 13.11.2005, 20:56
Perchilla, прикольно smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)