大数加法
写的有些复杂----,不过是对的
#include
#include
using namespace std;
char a[200];
char b[200];
char c[200];
int i;
int add_fun()
{
int a_length,b_length;
int j;
for(i=0;;i++)
{
if(a[i]=='\0')
break;
}
a_length=i;
for(i=0;;i++)
{
if(b[i]=='\0')
break;
}
b_length=i;
int n,m;
int jinwei=0;
for(n=a_length-1,m=b_length-1,i=0;n>=0&&m>=0;n--,m--,i++)
{
if(a[n]+b[m]+jinwei-'0'-'0'>9)
{
c[i]=a[n]-'0'+b[m]-10+jinwei;
jinwei=1;
}
else
{
c[i]=a[n]-'0'+b[m]+jinwei;
jinwei=0;
}
}
if(n<0&&m<0)
{
if(jinwei==1)
{
c[i]='1';
i++;
}
return 1;
}
if(n<0&&m>=0)
{
for(m;m>=0;m--)
{
if(b[m]+jinwei-'0'>9)
{
c[i]=b[m]+jinwei-10;
jinwei=1;
}
else
{
c[i]=b[m]+jinwei;
jinwei=0;
}
i++;
}
return 1;
}
if(n>=0&&m<0)
{
for(n;n>=0;n--)
{
if(a[n]+jinwei-'0'>9)
{
c[i]=a[n]+jinwei-10;
jinwei=1;
}
else
{
c[i]=a[n]+jinwei;
jinwei=0;
}
i++;
}
return 1;
}
return 1;
}
int main()
{
cin>>a>>b;
add_fun();
for(int j=i-1;j>=0;j--)
{
cout<
简易版本
#include
#include
#include
using namespace std;
int main()
{
char s1[200],s2[200];
int num1[200]={0},num2[200]={0},len1,len2,i,j; //数组清零
cin>>s1>>s2; //输入两个大数装入字符数组
len1=strlen(s1);
len2=strlen(s2); //获得大数的长度
for(i=len1-1,j=0;i>=0;i--)
num1[j++]=s1[i]-'0';
for(i=len2-1,j=0;i>=0;i--)
num2[j++]=s2[i]-'0'; //将字符数组的值转为整形数值并装入数组
for(i=0;i<200;i++)
{
num1[i]+=num2[i];
if(num1[i]>9)
{
num1[i]=num1[i]-10;
num1[i+1]++;
}
} //两个数组按位相加
for(i=199;(i>=0)&&(num1[i]==0);i--); //从高位找出第一个不是零的数
if(i>=0)
for(;i>=0;i--)
printf("%d",num1[i]); //输出数组
else
printf("0\n");
return 0;
}
大数减法
有bug啊啊啊啊,只能两个正整数相减,且被减数小于减数
#include
#include
#include
using namespace std;
int main()
{
char s1[200],s2[200];
int num1[200]={0},num2[200]={0},len1,len2,i,j; //数组清零
cin>>s1>>s2; //输入两个大数装入字符数组
len1=strlen(s1);
len2=strlen(s2); //获得大数的长度
for(i=len1-1,j=0;i>=0;i--)
num1[j++]=s1[i]-'0';//从左到右,位数越高
for(i=len2-1,j=0;i>=0;i--)
num2[j++]=s2[i]-'0'; //将字符数组的值转为整形数值并装入数组
int jiewei=0;
for(i=0;i<200;i++)
{
num1[i]-=num2[i];
if(num1[i]<0)
{
num1[i]=num1[i]+10;
num1[i+1]--;
}
} //两个数组按位相减
for(i=199;(i>=0)&&(num1[i]==0);i--); //从高位找出第一个不是零的数
if(i>=0)
for(;i>=0;i--)
printf("%d",num1[i]); //输出数组
else
printf("0\n");
return 0;
}
大数乘法
这个也写了好久,越来越垃圾了,细节啊,细节。有时候图快,直接复制粘贴一些代码,呵呵,这次又是全局变量惹得祸,还有 没有申请临时变量。
嘤嘤,好伤心啊,又变垃圾了
#include
#include
#include
using namespace std;
char s1[200],s2[200];
int num1[200]={0},num2[200]={0},len1,len2,i,j,sum[200]={0},jiashu[200]={0};//数组清零
void fun1()//两个数相加,没有错
{
for(int ii=0;ii<200;ii++)
{
sum[ii]+=jiashu[ii];
if(sum[ii]>9)
{
sum[ii]=sum[ii]-10;
sum[ii+1]++;
}
}
}
void fun2(int a,int n)//一位数相乘 ,a为一位数
{
memset(jiashu,0,sizeof(jiashu));
for(int ii=0;ii<200;ii++)//一位数乘法,没有错
{
jiashu[ii]+=a*num1[ii];
//cout<<"a num1[ii]"<9)
{
int temp=jiashu[ii];
jiashu[ii]=jiashu[ii]%10;
//cout<<"jiashu[ii]"<<" "<=0;ii--)//向后移几位
{
jiashu[ii+n]=jiashu[ii];
}
for(int ii=0;ii>s1>>s2; //输入两个大数装入字符数组
len1=strlen(s1);
len2=strlen(s2); //获得大数的长度
for(i=len1-1,j=0;i>=0;i--)
num1[j++]=s1[i]-'0';
for(i=len2-1,j=0;i>=0;i--)
num2[j++]=s2[i]-'0'; //将字符数组的值转为整形数值并装入数组
fun2(num2[0],0);
for(i=1;i=0)&&(sum[i]==0);i--); //从高位找出第一个不是零的数
if(i>=0)
for(;i>=0;i--)
printf("%d",sum[i]); //输出数组
else
printf("0\n");
return 0;
}
大数除法
这个没加小数点,求精度可以用这个方法哟。刚刚以为是正确的,试了一个整除的例子,死循环了,又改了一下。
#include
#include
#include
using namespace std;
char s1[200],s2[200];
int num1[200]={0},num2[200]={0},len1,len2,i,j,result[200]={0},jiashu[200]={0};//数组清零
int result_n=0;
int flag=0;
int cmp(int *y)
{
int ii,jj;
for(ii=199;num2[ii]==0;ii--);//找到最高位的位置
for(jj=199;y[jj]==0;jj--);//找到最高位的位置
if(ii>jj)
{
return 1;//x的位数多说明x大
}
if(ii=0;jj--)
{
if(num2[jj]>y[jj])
{
return 1;
}
if(num2[jj]0){
//扩大10倍
for(int ii=198;ii>=0;ii--)
{
y[ii+1]=y[ii];
}
y[0]=0;
//result[result_n++]=0;
}
int yy[200];
for(int ii=0;ii<200;ii++)
{
yy[ii]=y[ii];
}
int shang=0;
while(cmp(yy)<=0)
{
if(cmp(yy)==0)
flag=1;
shang++;
subtract(yy);
}
for(int ii=0;ii<200;ii++)//余数给num1
{
num1[ii]=yy[ii];
}
result[result_n++]=shang;
}
int main()
{
cin>>s1>>s2; //输入两个大数装入字符数组
len1=strlen(s1);
len2=strlen(s2);
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2)); //获得大数的长度
for(i=len1-1,j=0;i>=0;i--)
num1[j++]=s1[i]-'0';
for(i=len2-1,j=0;i>=0;i--)
num2[j++]=s2[i]-'0';
for(i=0;i<100&&flag==0;i++)
{
division();
} //将字符数组的值转为整形数值并装入数组 //两个数组按位相加
for(i=0;i<100;i++)
{
printf("%d",result[i]);
}
return 0;
}
大数开方,取整数部分
思路 一个 位数为 2n 的数 的根号 位数为 n;
一个 位数为(2n+1)的数 的根号 位数为 n+1;
然后就从高位开始一位一位的试,直到试到个位就可以了
模拟手算,结合上面的乘法 就能做出了,看到了一个高级解法,以后补上
大数除法
#include
#include
#include
using namespace std;
char s[10000005];
int main()
{
long long a = 73;
long long b = 137;
long long i = 1;
while(~scanf("%s",s)){
getchar();
int len = strlen(s);
long long ans = 0;
long long ans1 = 0;
for(int i = 0; i < len; ++i)
{
ans = ans*10 + (s[i]-'0');
ans %= a;
}
for(int i = 0; i < len; ++i)
{
ans1 = ans1*10 + (s[i]-'0');
ans1 %= b;
}
if(ans==0&&ans1==0){
printf("Case #%lld: YES\n",i++);
}else{
printf("Case #%lld: NO\n",i++);
}
}
return 0;
}