📄 supernumbercount.cpp
字号:
#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAX 200
void read(int *a) //字符置换
{
int len,i,flag=0;
char s[MAX];
aa:
while(1)
{
scanf("%s",s);
len=strlen(s);
if(s[0]=='-') flag=1;
for(i=len-flag;i>=1;i--)
{
if((s[len-i]-'0')<0||(s[len-i]-'0')>9)
{
printf("你输入的不合法,请重新输入数据:\n");
getchar();
goto aa;
}
else
a[i]=s[len-i]-'0';
}
if(flag)
a[0]=-(len-1);
else
a[0]=len;
break;
}
return;
}
void print(int *a) //输出结果
{
int i;
if(a[0]<0) printf("-");
if(a[0]==0)
{
printf("0");
return;
}
for(i=abs(a[0]);i>=1;i--)
printf("%d",a[i]);
printf("\n");
}
void jinwei(int *a) //处理进位
{
int p;
for(p=1;p<a[0]||a[p]>=10;p++)
{
if(p>=a[0]) a[p+1]=0;
a[p+1]+=a[p]/10;
a[p]=a[p]%10;
}
if(p>=a[0]) a[0]=p;
return;
}
void jiafa(int *a,int *b,int *c) //加法
{
int len,i;
if(a[0]<b[0]) len=a[0];
else len=b[0];
for(i=1;i<=len;i++)
c[i]=a[i]+b[i];
if(len<a[0]) //多出的按位入组
{
for(;i<=a[0];i++)
c[i]=a[i];
c[0]=a[0];
}
else
{
for(;i<=b[0];i++)
c[i]=b[i];
c[0]=b[0];
}
jinwei(c);
}
void xiangcheng(int *a,int x,int *b) //数组a按位乘以数x
{
int i;
for(i=1;i<=a[0];i++)
b[i]=a[i]*x;
b[0]=a[0];
jinwei(b);
return;
}
void chengfa(int *a,int *b,int *c) //乘法
{
int i,temp[MAX],j;
xiangcheng(a,b[1],c);
for(i=2;i<=b[0];i++)
{
if(b[i]==0)
{
c[0]++;
for(j=c[0];j>1;j--)
c[1]=0;
}
else
{
xiangcheng(a,b[i],temp);
for(j=1;j<i;j++)
xiangcheng(temp,10,temp);
jiafa(c,temp,c); //将积相加
}
}
}
void jiewei(int *a) //处理借位
{
int i;
for(i=1;i<=a[0];i++)
if(a[i]<0)
{
a[i]+=10;
a[i+1]-=1;
}
}
void jian(int *a,int *b,int *c) //按位相减
{
int i;
for(i=1;i<=b[0];i++)
c[i]=a[i]-b[i];
if(a[0]==b[0]) c[0]=a[0];
for(;i<=a[0];i++)
c[i]=a[i];
jiewei(c); //对c中进行借位处理
i=c[0];
while(1)
if(c[i]==0) i--;
else break;
c[0]=i;
return;
}
void jianfa(int *a,int *b,int *c) //减法
{
int i,flag=0;
for(i=1;i<=a[0];i++) //判断a是否等于b
if(a[i]!=b[i]) {flag=1;break;}
if (flag==0)
{
c[0]=0;
return;
}
flag=0;
if(a[0]==b[0]) //a、b位数相同
{
i=a[0];
while(i>0)
{
if(a[i]>b[i])
{
jian(a,b,c);
break;
}
if(a[i]<b[i])
{
flag=1;
jian(b,a,c);
break;
}
i--;
}
}
if(a[0]>b[0]) //a位数大于b
jian(a,b,c);
else if (a[0]<b[0]) //a位数小于b
{
flag=1;
jian(b,a,c);
}
if(flag)
c[0]=-c[0];
else
c[0]=c[0];
}
int chufa(int *a,int *b)
{
int n=0,i,t=0;
if(a[0]==b[0]) //两相同位数的数相除
{
for(i=1;i<=a[0];i++)
{
if(a[i]-b[i]<0) n--;
else if(a[i]-b[i]==0) n++;
else goto aa;
}
if(n<a[0]) return 0;
else if(n==a[0]) return 1;
}
else if(a[0]==1&&a[1]==0) return 0; //a为0
else if(b[0]==1&&b[1]==1) return -1; //b为1
else if(a[0]<b[0]) return 0; //a比b小
else //a比b大
{
aa:
jianfa(a,b,a);
if(a[0]>=0) t++;
while(a[0]>0&&a[0]>=b[0])
{
jianfa(a,b,a);
t++;
}
return t;
}
}
void main()
{
int a[MAX],b[MAX],c[MAX],n=1;
int d,m;
while(n) //菜单循环
{
printf("\n请选择功能(0~4):\n");
printf("1.大整数加法\n");
printf("2.大整数减法\n");
printf("3.大整数乘法\n");
printf("4.大整数除法\n");
printf("0.退出\n");
scanf("%d",&d);
switch(d)
{
case 1:
printf("请输入大整数A:");
read(a);
printf("请输入大整数B:");
read(b);
if(a[0]<0 && b[0]<0) //a、b都为负数
{
a[0]=-a[0];b[0]=-b[0];
jiafa(a,b,c);c[0]=-c[0];
a[0]=-a[0];b[0]=-b[0];
}
if(a[0]>0 && b[0]<0) //a正数b负数
{
b[0]=-b[0];
jianfa(a,b,c);
b[0]=-b[0];
}
if(a[0]>0 && b[0]>0) //a、b都为正数
{
jiafa(a,b,c);
}
if(a[0]<0 && b[0]>0) //a负数b正数
{
a[0]=-a[0];
jianfa(b,a,c);
a[0]=-a[0];
}
printf("A:\n");
print(a);
printf("B:\n");
print(b);
printf("C=A+B:\n");
print(c);
break;
case 2:
printf("请输入大整数A:");
read(a);
printf("请输入大整数B:");
read(b);
if(a[0]<0 && b[0]<0) //a、b都为负数
{
a[0]=-a[0];
b[0]=-b[0];
jianfa(b,a,c);
a[0]=-a[0];
b[0]=-b[0];
}
if(a[0]<0 && b[0]>0) //a负数b正数
{
a[0]=-a[0];
jiafa(a,b,c);
a[0]=-a[0];
c[0]=-c[0];
}
if(a[0]>0 && b[0]<0) //a正数b负数
{
b[0]=-b[0];
jiafa(a,b,c);
b[0]=-b[0];
}
if(a[0]>0&&b[0]>0) //a、b都为正数
jianfa(a,b,c);
printf("A:\n");
print(a);
printf("B:\n");
print(b);
printf("C=A-B:\n");
print(c);
break;
case 3:
printf("请输入大整数A:");
read(a);
printf("请输入大整数B:");
read(b);
if(a[0]<0 && b[0]>0) //a负数b正数
{
a[0]=-a[0];
chengfa(a,b,c);
a[0]=-a[0];
c[0]=-c[0];
}
if(a[0]>0&&b[0]<0) //a正数b负数
{
b[0]=-b[0];
chengfa(a,b,c);
b[0]=-b[0];
c[0]=-c[0];
}
if(a[0]<0&&b[0]<0) //a、b都为负数
{
a[0]=-a[0];
b[0]=-b[0];
chengfa(a,b,c);
a[0]=-a[0];
b[0]=-b[0];
}
chengfa(a,b,c);
printf("A:\n");
print(a);
printf("B:\n");
print(b);
printf("C=A*B:\n");
print(c);
break;
case 4:
printf("请输入大整数A:");
read(a);
printf("请输入大整数B:");
read(b);
if(b[0]==1&&b[1]==0) //b为0时
printf("错误!大整数B不可为零!\n");
else
{
printf("A:\n");
print(a);
printf("B:\n");
print(b);
printf("C=A/B:\n");
m=chufa(a,b);
if(m==-1) print(a); //b为1时
else printf("%d\n",m);
}
break;
case 0:n=0;break;
default:printf("输入错误,请重新输入:");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -