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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2009, 11:44   #1
Stigma-99
Новичок
Джуниор
 
Регистрация: 01.08.2009
Сообщений: 2
По умолчанию А летом работается хуже...помогите,пожалуйста

здравствуйте,помогите...очень надо
1)не могу найти ошибку (Проверить, делится ли данное очень длинное целое(число >100 цифр) на 11 (использовать признак делимости))


Код:
 var   odc:string [200];
         S,i,L,k:integer;
begin
     odc:= edit1.Text;
     s:=0;
     L:=length(odc);
     for i:= L downto 1 do
 begin
     K:=strtoint(odc[i]);
     S:= S+k;
     if s mod 11 =0 then StaticText1.caption:='Делится'
 else  StaticText1.caption:='Нет, не делится';

в любом случае пишет,что не делиться

2)Найти минимальное число, являющееся степенью двойки, большее данного очень длинного целого.(задачу легко решаю,но на листе бумаги,как дело доходит до кода,ступор)
заранее большое спасибо

Последний раз редактировалось Stilet; 03.08.2009 в 11:29.
Stigma-99 вне форума Ответить с цитированием
Старый 01.08.2009, 11:56   #2
ОДИНОЧЕСТВО В СЕТИ
Любопытная Вредина
Участник клуба
 
Аватар для ОДИНОЧЕСТВО В СЕТИ
 
Регистрация: 19.06.2009
Сообщений: 1,285
По умолчанию

Цитата:
Число делится на 11 тогда и только тогда, когда сумма цифр с чередующимися знаками равна 0 или делится на 11
а где у вас чередование знаков реализовано?
Дурь - это особая форма материи, которая не возникает ниоткуда и не исчезает никуда, а лишь переходит из одной головы в другую.
ОДИНОЧЕСТВО В СЕТИ вне форума Ответить с цитированием
Старый 01.08.2009, 12:10   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

По первой.
Код:
for i:=1 to  L  do
begin
K:=strtoint(odc[i]);
if odd(i) then S:= S+k//если нечетный индекс-прибавляем
else S:=S-k;//// если четный-вычитаем
end;
puporev вне форума Ответить с цитированием
Старый 01.08.2009, 12:28   #4
ОДИНОЧЕСТВО В СЕТИ
Любопытная Вредина
Участник клуба
 
Аватар для ОДИНОЧЕСТВО В СЕТИ
 
Регистрация: 19.06.2009
Сообщений: 1,285
По умолчанию

к 1.....
Код:
uses ......math;
....
function eleven(edt:Tedit):boolean;
var i,k:integer;
    s:Extended;
    l:integer;
	  c:string;
begin
  s:=0;
  c:=edt.text;
  l:=length(c);
  for i:= 1 to l do begin
    k:=i-1;
    s:=s+(strtoint(c[i]))*power(-1,k);
  end;
  Str(s:4:0,c);
  k:=StrToInt(c);
  if (k=0) or (k mod 11=0) then result:=true
  else result:=false;
  end;
пример использования
Код:
procedure TForm1.btn1Click(Sender: TObject);
begin
    if eleven(edt1) then ShowMessage('yes!')
     else   ShowMessage('no!')
end;
Дурь - это особая форма материи, которая не возникает ниоткуда и не исчезает никуда, а лишь переходит из одной головы в другую.
ОДИНОЧЕСТВО В СЕТИ вне форума Ответить с цитированием
Старый 01.08.2009, 12:42   #5
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Что-то мне кажется что подключать модуль для смены знака числа это как-то уж слишком.
puporev вне форума Ответить с цитированием
Старый 01.08.2009, 12:48   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Ну тогда уж и StrToInt для одной цифры тоже слишком.
Somebody вне форума Ответить с цитированием
Старый 01.08.2009, 12:53   #7
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
Ну тогда уж и StrToInt для одной цифры тоже слишком.
Так было написано у автора. Можно конечно писать val();, но не думаю что это чем-то лучше. Или Вы знаете другие способы преобразования символов в цифры?
puporev вне форума Ответить с цитированием
Старый 01.08.2009, 16:48   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Или Вы знаете другие способы преобразования символов в цифры?

для одиночного символа?
конечно же знаем.
способ 1) (на основании того, коды цифр идут подряд):
Код:
ord(c[i]) - ord('0')
способ 2):
Код:
const Digits : string[10] = '0123456789';
...
  pos(c[i],Digits)-1


но тем не менее, согласен с мнением puporev —использование функции Power в данном случае считаю неэффективным и некрасивым...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.08.2009, 08:34   #9
ОДИНОЧЕСТВО В СЕТИ
Любопытная Вредина
Участник клуба
 
Аватар для ОДИНОЧЕСТВО В СЕТИ
 
Регистрация: 19.06.2009
Сообщений: 1,285
По умолчанию

Цитата:
использование функции Power в данном случае считаю неэффективным и некрасивым
раз уж все ругаются тогда так :

Код:
function ChInNum(c:char):integer;
begin
case c of
  '0':result:=0;
  '1':result:=1;
  '2':result:=2;
  '3':result:=3;
  '4':result:=4;
  '5':result:=5;
  '6':result:=6;
  '7':result:=7;
  '8':result:=8;
  '9':result:=9
  else result: =-1;
end;
end;

function power(Base, Exponent: Extended): Extended;
var
  ex: extended;
begin
  power := 0;
  if (exponent <> 0)
    and (frac(trunc((1 / exponent) * 1000000) / 1000000) = 0)
    and (base < 0) then
  begin
    if round(1 / exponent) mod 2 = 0 then
      exit;
    ex := Exp(Exponent * Ln(-Base));
    power := -ex;
  end
  else
  begin
    if Exponent = 0.0 then
      power := 1.0
    else if (Base = 0.0) and (Exponent > 0.0) then
      power := 0.0
    else if (Frac(Exponent) = 0.0) and (Abs(Exponent) <= MaxInt) then
      power := IntPower(Base, Integer(Trunc(Exponent)))
    else
      power := Exp(Exponent * Ln(Base))
  end;
end;
function eleven(edt:Tedit):boolean;
var i,k:integer;
    s:Extended;
    l:integer;
	  c:string;
begin
  s:=0;
  c:=edt.text;
  l:=length(c);
  for i:= 1 to l do begin
    k:=i-1;
    s:=s+(ChInNum(c[i]))*power(-1,k);
  end;
  Str(s:4:0,c);
  k:=StrToInt(c);
  if (k=0) or (k mod 11=0) then result:=true
  else result:=false;
  end;
пример использования тот же!
Дурь - это особая форма материи, которая не возникает ниоткуда и не исчезает никуда, а лишь переходит из одной головы в другую.
ОДИНОЧЕСТВО В СЕТИ вне форума Ответить с цитированием
Старый 02.08.2009, 09:40   #10
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Если еще интересует вторая задача, то можно решить так(один из возможных вариантов).
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Edit2: TEdit;
    Label2: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
   
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
function Power_2(st:word):string; //возведение числа 2 в "большую" степень
var
s,tt : string;
c : char;
i,j,k,a,b,len : integer;
begin
s := '2'; {начальная строка}
for i:=1 to st-1 do
  begin
  tt := s;{запоминаем строку}
  len := length(tt);{длина запомненной строки 1,2,3..}
  s := '';{сбрасываем строку}
  k := 0;
  for j:=1 to len do
    begin
    a := (ord(tt[j])-48)*2 + k; {умножаем столбиком каждый раз новое число}
    b := a mod 10; {последняя цифра}
    k := a div 10; {перенос}
    s := s + chr(b+48);{новая строка без последнего переноса}
    end;
  if k <> 0 then s := s + chr(k+48);{добавляем в конец последний перенос}
  end;
len := length(s); {переворачиваем строку}
for i:=1 to trunc(len/2) do
 begin
 c := s[len-i+1];
 s[len-i+1] := s[i];
 s[i] := c;
 end;
result:=s;
end;
function MenRavn(a,b:string):boolean; //функция сравнения меньше или равно
var i,m,n:byte;
begin
n:=length(a);
m:=length(b);
if n=m then
 begin
  result:=true;
  for i:=n downto 1 do
  if b[i]<a[i] then
   begin
    result:=false;
    exit;
   end
  else if b[i]>=a[i] then continue;
 end
else
 if n<m then result:=true
 else result:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
var p:integer;
    ch,y:string;
begin
ch:=Edit1.Text;
p:=1;
y:='2';
while MenRavn(y,ch) do  //пока меньше или равно предела
 begin
  y:=Power_2(p); //возводим 2 в степень
  p:=p+1; //наращиваем степень
 end;
Edit2.Text:=y;
end;
//разрешим только ввод цифр и их "стирание"
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
  #8,'0'..'9' :  ; // цифры и <Back Space>
     else key := Chr(0);// остальные символы запрещены
    end;
end;

end.

Последний раз редактировалось puporev; 02.08.2009 в 09:43.
puporev вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите создать програму для роботы с файлами, пожалуйста помогите нужно очень срочно Сергей Человек Фриланс 3 06.07.2009 19:30
Есть кто из Сочи;) ... Если нет, то приезжайте летом nomad7 Свободное общение 8 06.01.2009 18:59
99% форумчан, нам брошен вызов - почему мы не хуже 19 летнего прогера? mihali4 Свободное общение 20 01.04.2008 10:05
обновление в блоге - Диплом. Создание и продвижение сайта - готовь сани летом, а дипл Pblog Обсуждение статей 0 31.08.2007 20:00