Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2009, 23:23   #1
Gakusei
Пользователь
 
Регистрация: 01.02.2009
Сообщений: 13
Вопрос Borland C 3.1 - надо решить задачку.

"Дано число N. Сколько различных цифр в его десятичной записи?"
Код:
#include <stdio.h>
#include <conio.h>
#include <MATH.H>
void main()
{
	clrscr();
	double n;
	printf("Введите число\n");
	scanf("%lf", &n);
	if(n < 0)
	n=-n;
        
        int num[10];
	long int x;
	x = n;

	for(int cnt=0; x>=1; cnt++)
	{
		num[cnt] = x%10;
		x /= 10;
	}
	
	//printf("Кол-во цифр в числе %lf равно %i", n, cnt);
	getch();
}
Вот. Считается кол-во цифр в числе. Теперь мне надо сравнить полученные num[], чтоб узнать кол-во различных цифр (ну или одинаковых). ток вот как это сделать я не знаю, все что знал перепробовал и безуспешно. Можно пользоваться только самыми элементарными командами типа printf, scanf, if, switch, for, while, do-while, и массивами аналогичными вышеуказанных.

Последний раз редактировалось Gakusei; 14.02.2009 в 23:25.
Gakusei вне форума Ответить с цитированием
Старый 15.02.2009, 01:02   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Чтобы узнать количество различных цифр, нужно 2 цикла. Внешний проходит по всем цифрам, а второй (внутренний) - по всем цифрам до текущей.
Код:
#include <stdio.h>
#include <conio.h>

int main(){
long n,x;
int num[10],i,j,cnt,cnt2;
printf("Vvedite chislo:\n");
scanf("%ld",&n);
if(n<0)
 n = -n;
x = n;
for(cnt=0;x>0;cnt++)
 {
  num[cnt] = x%10;
  x /= 10;
 }
cnt2 = 0;
for(i=0;i<cnt;i++)
 for(j=0;j<=i;j++)
  if(j==i) cnt2++;
  else if(num[j]==num[i]) break;

printf("Kolichestvo razlichnyh cifr: %d\n",cnt2);

getch();
return 0;
}
Кстати, math.h вам здесь не понадобится.
И еще: вы объявляете cnt в цикле:
Код:
for(int cnt=0; x>=1; cnt++)
а затем используете ее после цикла. Это не совсем корректно.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 15.02.2009, 11:40   #3
Gakusei
Пользователь
 
Регистрация: 01.02.2009
Сообщений: 13
По умолчанию

Спасибо. Все работает, ток вот щас буду разбираться почему оно работает, тк по-моему
Код:
if(j==i) cnt2++;
будет всегда выполняться, ведь изначально они равны 0 и так и будут вместе изменятся на 1. Поэтому не вижу варианта когда может выполняться
Код:
else if(num[j]==num[i]) break;
.
Gakusei вне форума Ответить с цитированием
Старый 15.02.2009, 13:55   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Gakusei
Вместе изменяться на 1 они не будут, т.к. цикл по j вложенный. При i равном, скажем, 4, j будет изменяться от 0 до 4.

Возьмем, к примеру, число 35554.
После выполнения первой половины программы, получим массив num = {4,5,5,5,3}. cnt=5.
Заходим в цикл. i=0
Теперь в цикл по j. j=0.
Т.к. i==j, то cnt2++.
----
i=1
j изменятеся от 0 до 1, то есть проверка
else if(num[j]==num[i]) break;
выполнится. Т.к. 4 != 5, то j++
i==j. Значит, цифра 5 не встречается в подмножестве {4}
---
Далее i=2;
j=0;
5 != 4 -> continue
j=1;
5 == 5, то есть 2-я (от нуля) цифра встречается в подмножесте {4,5}, значит, она нам не подходит.
И так далее..
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 15.02.2009 в 15:08. Причина: опечатка
Sazary вне форума Ответить с цитированием
Старый 15.02.2009, 14:57   #5
Gakusei
Пользователь
 
Регистрация: 01.02.2009
Сообщений: 13
По умолчанию

Аа, теперь все понял. спс.
Gakusei вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите решить одну задачку! Никак не врубаюсь. На завтра надо. Сделайте подарок на день рождения:) Женек Помощь студентам 2 01.10.2008 19:48
Надо проверить задачку a.s.d Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 16.09.2008 09:38
помогите пожалуйста решить задачку,очень надо __k1ll3r__ Паскаль, Turbo Pascal, PascalABC.NET 2 28.05.2008 08:47