IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Ну очень длинные числа, Си
blackhard
сообщение 3.05.2008 14:37
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 151
Пол: Мужской
Реальное имя: иван

Репутация: -  0  +


В общем суть задания это создание калькулятора который смогбы вычислить 99999999999! ну или 23142342342314234231423142343214*4325234534532534523443.Примерно так.Я решил подобные числа хранить в массивах типа int.Даже написал уже 2 ф.и для сложения и вычитания таких чисел(Но вот только если для беззнаковых), а вот как быть со знаком?Я подумал сделать так если перед первым числом стоит знак - то из 0 вычесть значение 1го элемента массива в который я это число помещаю.Разумно ли сделать так?И еще 1 вопрос никак не мгу сообразить как осуществить операцию ! при подобном представлении числа ?

Вот вобщемто то что я уже написал.



#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<conio.h>
#include<ctype.h>
#include"TARASOV_ERROR.h"

#define KOL 5
#define STRLEN 50000
#define OSN 10

FILE *fo,*fi;

char *sim[KOL]={"+",
				"-",
				"*",
				"/",
				"!"};
char answer[STRLEN];
int num1[STRLEN],num2[STRLEN],res[STRLEN],*n1=num1,*n2=num2,*r=res,q,e,k,w1,w2,i;
	char oper[STRLEN],*op=oper,c;

int showstring(const char *str)
{
	char strASCII[STRLEN];
	CharToOem (str,strASCII);
	printf("%s\t",strASCII);
	return 0;
}
int summa()
{

	e=0;
	while(w1||w2){	
		q=(*n1--)+(*n2--)+e;
		if(q>9){q%=OSN;*r++=q;e=1;}
		else{*r++=q;e=0;}
		if(w1>0)w1--;
		if(w2>0)w2--;
		i++;
	}
	if(e==1){*r++=e;i++;}
	for(i--;i!=-1;i--)
		printf("%d",res[i]);
	printf("\n");			
	return 0;
}
int subtract()
{
	e=0;
	r=res;
	i=w1;
	while(w1){
		*n1+=e;
		if(*n1<*n2){*r++=(*n1--)+OSN-(*n2--);e=-1;} 
		else {*r++=(*n1--)-(*n2--);e=0;}
		w1--;
	}
	while(res[i]==0)i--;
	for(i;i!=-1;i--)
		printf("%d",res[i]);
	printf("\n");
	return 0;
}
void multiple()
{

}
void DIV()
{

}
void Fact()
{

}
int main()
{
	
	w1=0;w2=0;

	fo=fopen("outtext.txt","w");
	if((fi=fopen("in.txt","r"))==NULL)exit(Error(2,"in.txt"));	
		
	while(c!=EOF)
	{
		memset(num1,0,sizeof(num1));
		memset(num2,0,sizeof(num2));
		memset(res,0,sizeof(res));
		memset(oper,0,sizeof(oper));
		c=getc(fi);
        while(isspace(c))c=getc(fi);
		if(c==EOF){fclose(fi);return 0;}
		while(isalnum(c)){
		w1++;
		*n1++=c-'0';
		c=fgetc(fi);}
		n1--;
		while(isspace(c))c=getc(fi);
	    while(!isspace(c)&&c!=';'&&!isdigit(c)){
		*op++=c;
		c=fgetc(fi);}
	    *op--=0;
	    while(isspace(c))c=getc(fi);
     	while(c!=';'){
		w2++;
		*n2++=c-'0';
		c=fgetc(fi);}
	    n2--;
		for(k=0;k<KOL;k++)
			if(*op==*sim[k])break;
		switch(k)
		{
			case 0:summa();
					break;
			case 1:subtract();
					break;
			case 2: multiple();
					break;
			case 3: DIV();
					break;
			case 4: Fact();
					fprintf(fo,"%s",answer);
			break;
		}
		//}
	}
  

//	printf("%d",num1[4]);
	fclose(fi);
	fclose(fo);
	return 0;
}



Сообщение отредактировано: blackhard - 3.05.2008 14:39
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 14.08.2025 5:12
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"