下面是我自己写的头文件,报错:
第112行 [Error] unknown type name 'class'
第113行 [Error] expected '=', ',', ';', 'asm' or 'attribute' before '{' token
#include <windows.h>
#include <ctype.h>
#include <string.h>
#define Nu NULL
#define LL {long long}
#define In int
#define Do double
#define Bo bool
#define Tr true
#define Fl false
#define Ch char
#define Vo void
#define Wc wchar_t
#define Us unsigned
#define Sh short
#define Re register
#define IC include
#define Co const
#define Cl class
#define Pu public
#define Pri private
#define Pro protected
#define St struct
#define Un union
#define Ex extern
#define Au auto
#define Ve vector
#include <stdio.h>
#define exrt(exrt1,exrt2) pow(exrt1,1.0/exrt2)
#define MEM(mem) memset(mem,0,sizeof(mem))
//---------------------------------------------
#define BTC SetConsoleTextAttribute
#define STH GetStdHandle(STD_OUTPUT_HANDLE)
#define FG FOREGROUND
#define BG BACKGROUND
#define IS INTENSITY
#define CL COMMON_LVB
#define LE LEADING_BYTE
#define TE TRAILING_BYTE
#define GH BACKGROUND
#define GL INTENSITY
#define GV COMMON_LVB
#define RV LEADING_BYTE
#define UN TRAILING_BYTE
#define STI std::stoi
#define ITS std::to_string
//---------------------------------------------
#define SetSize(col,row) { \
\
char cmd[64]; \
sprintf(cmd, "mode con cols=%d lines=%d", col, row);\
system(cmd);\
}
#define Fixed SetWindowLongPtrA(GetConsoleWindow(), GWL_STYLE, GetWindowLongPtrA(GetConsoleWindow(),GWL_STYLE)& ~WS_SIZEBOX & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX)
#define Title(title) SetConsoleTitle(title);
#define Sever FreeConsole()
#define NewWin AllocConsole()
//---------------------------------------------
#define IA(ia) isaldha(ia)
#define ID(id) isdigit(id)
#define IP(ip) isprint(ip)
#define TU(tu) toupper(tu)
#define TL(tl) tolower(tl)
#define LB(lb,lbch) lower_bound(lb,sizeof(lb),lbch)
#define RE(re,rl) reverse(re,re+rl);
#define RO(ro,rm,rl) rotate(ro,ro+rm,ro+rl)
#define EQ(eq1,eqL,eq2) equal(eq1,eq1+eqL,eq2)
#define ME(me1,me1l,me2,me2l,me3) merge(eq1, eq1+eq1l, eq2, eq2l, eq3)
//---------------------------------------------
#define SUI(sui1,sui1l,sui2,sui2l,sui3) set_union(sui1,sui1+sui1l,sui2,sui2+sui2l,sui3)
#define SIS(sis1,sis1l,sis2,sis2l,sis3) set_intersection(sis1,sis1+sis1l,sis2,sis2+sis2l,sis3)
#define OIA ios::sync_with_stdio(false)
#define O2op {pragma GCC optimize(2)}
#define O3op {pragma GCC optimize(3)}
#define NFre {\
char *p1,*p2,buf[100000];\
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)\
int read()\
{\
int x=0,f=1;\
char ch=nc();\
while(ch<48||ch>57)\
{\
if(ch=='-')\
f=-1;\
ch=nc();\
}\
while(ch>=48&&ch<=57)\
x=x*10+ch-48,ch=nc();\
return x*f;\
}\
}
#define NFwr {\
void write(int x)\
{\
if(x<0)\
putchar('-'),x=-x;\
if(x>9)\
write(x/10);\
putchar(x%10+'0');\
}\
}
//---------------------------------------------
#define Ar2(Aa,Am,An,At) \
for(int i=0;i<=Am;i++)\
{\
for(int j=0;j<=An;j++)\
{\
Aa[i][j]=At;\
}\
}
class ALN//错误在这里
{//错误在这里
//大数加法
public:
string Add(string num1, string num2)
{
int end1 = num1.size() - 1, end2 = num2.size() - 1;
string ret; //存储两个字符串相加后的结果
int carry = 0; //进位(初始时进位设置为0)
while (end1 >= 0 || end2 >= 0)
{
//1、取出num1中本次待相加的数字
int a = 0;
if (end1 >= 0)
{
a = num1[end1] - '0';
end1--;
}
//2、取出num2中本次待相加的数字
int b = 0;
if (end2 >= 0)
{
b = num2[end2] - '0';
end2--;
}
//3、将这两个数字相加(注意加上进位)
int sum = a + b + carry;
//4、判断是否需要进位
if (sum > 9)
{
sum -= 10;
carry = 1; //需要进位,将carry设置为1
}
else
{
carry = 0; //不需要进位,将carry设置为0
}
ret += (sum + '0');
}
if (carry != 0) //判断是否还需进位(可能两个数的最高位相加后会进位)
ret += '1';
reverse(ret.begin(), ret.end()); //将ret字符串进行反转
return ret; //返回两个字符串相加后的结果
}
//大数比较
int Cmp(string& num1, string& num2)
{
if ((num1.size() > num2.size()) || (num1.size() == num2.size() && num1 > num2)) return 1; //num1大于num2,返回1
else if ((num1.size() < num2.size()) || (num1.size() == num2.size() && num1 < num2)) return -1; //num1小于num2,返回-1
else return 0; //num1等于num2,返回0
}
//大数减法
string Less(string num1, string num2)
{
//保证num1大于等于num2
if (Cmp(num1, num2) == -1)
{
return "-" + Less(num2, num1); //num1小于num2,则返回num2-num1所得到的结果的负值
}
int end1 = num1.size() - 1, end2 = num2.size() - 1;
string ret; //存储两个字符串相减后的结果
int borrow = 0; //借位(初始时借位设置为0)
while (end1 >= 0)
{
//1、取出num1中本次待相减的数字
int a = num1[end1] - '0';
end1--;
//2、取出num2中本次待相减的数字
int b = 0;
if (end2 >= 0)
{
b = num2[end2] - '0';
end2--;
}
//3、将这两个数字相减(注意减去借位)
int differ = a - b - borrow;
//4、判断是否需要进位
if (differ < 0)
{
differ = 10 + differ;
borrow = 1; //需要借位,将borrow设置为1
}
else
{
borrow = 0; //不需要借位,将borrow设置为0
}
ret += (differ + '0');
}
reverse(ret.begin(), ret.end()); //将ret字符串进行反转
//过滤掉ret字符串前面的'0'
size_t pos = ret.find_first_not_of('0');
if (pos == string::npos) //ret中全部为'0',则两个数相减后的结果为0
{
return "0";
}
return ret.substr(pos); //返回两个字符串相减后的结果
}
string MTP(string num1, string num2)
{
if (num1 == "0" || num2 == "0") //两个操作数中有一个为0,则结果为0
return "0";
int m = num1.size(), n = num2.size();
vector<int> arr(m + n, 0); //开辟数组arr的大小为m+n,并且全部初始化为0
//1、取乘数的每一位与被乘数的每一位相乘,将结果累加到数组arr的对应下标位置
for (int i = n - 1; i >= 0; i--) //取乘数的每一位
{
int a = num2[i] - '0';
for (int j = m - 1; j >= 0; j--) //取被乘数的每一位
{
int b = num1[j] - '0';
arr[i + j + 1] += a*b; //乘数第i位与被乘数第j位相乘后的结果累加到数组arr中下标为i+j+1的位置
}
}
//2、从后往前对数组arr进行进位操作
int end = m + n - 1;
while (end > 0)
{
arr[end - 1] += arr[end] / 10; //进位的值加到前一个位置
arr[end] %= 10; //进位后剩下的值存放到当前位
end--; //处理下一位
}
//3、依次将数据尾插到字符串ret当中
string ret; //存放两个字符串相乘后的结果
int flag = 1; //默认有效值从数组arr当中下标为1的位置开始
if (arr[0] != 0) flag = 0; //若数组arr当中下标为0的位置的值不为0,则有效值从第0位开始
for (int i = flag; i < m + n; i++)
{
ret += (arr[i] + '0');
}
return ret; //返回两个字符串相乘后的结果
}
//大数除法
string divide(string num1, string num2, int n,bool pd)
{
if (num2 == "0") //除数不能为0
return "error";
string ret; //存储两个字符串相除后的结果
string tmp; //余数
//1、先计算小数点前面的数
if (num1.size() < num2.size()) //num1的位数小于num2
{
ret += "0."; //商为0
tmp = num1; //余数为num1
if(!pd)return "0";
}
else //num1的位数大于等于num2
{
size_t len = num2.size(); //除数的长度
tmp = num1.substr(0, len); //先取出被除数的高len位
while (1)
{
//a、计算tmp当中最多有多少个num2(tmp除以num2的商)
int count = 0;
while (Cmp(tmp, num2) != -1) //tmp大于等于num2,则说明商可以更大
{
tmp = Less(tmp, num2);
count++;
}
//b、将商值尾插到ret当中
ret += (count + '0');
//c、如果num1的所有位都被取完了,则小数点之前的结果计算完毕
if (len >= num1.size()||!pd)
break;
//d、如果num1当中还有未取的位,则继续从num1中一位尾插到tmp当中
tmp += num1[len];
len++; //下一次待取位下标
}
ret += "."; //小数点之前的结果计算完毕,加上小数点
//如果ret最高位为0,且该位后面不是小数点,则需要将这个0过滤掉
if (ret.size() != 2 && ret[0] == '0')
ret = ret.substr(1);
}
//2、再计算小数点后面的数(保留n位小数)
for (int i = 0; i < n; i++)
{
if (tmp == "0") //tmp为0(余数为0)
{
ret += "0"; //则直接在ret后面补0即可
}
else //tmp不为0(余数不为0)
{
tmp += "0"; //在余数后面补0,继续进行计算
//a、计算tmp当中最多有多少个num2(tmp除以num2的商)
int count = 0;
while (Cmp(tmp, num2) != -1)
{
tmp = Less(tmp, num2);
count++;
}
//b、将商值尾插到ret当中
ret += (count + '0');
}
}
return ret; //返回两个字符串相除后的结果
}
string DVD(string num1,string num2, int n,bool pd)//若pd=false,除法仅算到整数,反之
{
return divide(num1,num2,n,pd);
}
string DVD(string num1,string num2,bool pd)
{
return divide(num1,num2,2,pd);
}
string RMD(string num1,string num2)//余数
{
return Less(num1,MTP(divide(num1,num2,0,false),num2));
}
};
求更正。