大整数加法
#include <stdio.h>
#include <string.h>
char a1[2000],b1[2000];
int a[205],b[205],c[205],la,lb,lc,x,i;
int main(){
la=strlen(gets(a1));
lb=strlen(gets(b1));
for(i=0;i<=la-1;i++) a[la-i]=a1[i]-'0'; //倒序存储
for(i=0;i<=lb-1;i++) b[lb-i]=b1[i]-'0';
lc=1;
while(lc<=la||lc<=lb){ //进行加法进位
c[lc]=a[lc]+b[lc]+x; //对应第i位相加并加上上一次的进位
x=c[lc]/10; //向高位进位
c[lc]%=10; //存储第i位的值
lc++; //位置下标变量
}
c[lc]=x;
if(c[lc]==0) lc--; //相加结果数组最高位有前导零
for(i=lc;i>=1;i--) printf("%d",c[i]); //倒序输出
return 0;
}
大整数减法
#include <stdio.h>
#include <string.h>
char a1[205],b1[205],a[205],b[205],c[205],t[205];
int la,lb,lc,x,i;
int main(){
la=strlen(gets(a1)); //输入被减数
lb=strlen(gets(b1)); //输入减数
if(la<lb||la==lb&&strcmp(a1,b1)<0){
strcpy(t,a1),strcpy(a1,b1),strcpy(b1,t);
printf("-");
}
for(i=0;i<la;i++) a[la-i]=a1[i]-'0';
for(i=0;i<lb;i++) b[la-i]=b1[i]-'0';
i=1;
while(i<=la||i<=lb){
if(a[i]<b[i]){ //不够减向高位借一当十
a[i]+=10;
a[i+1]--;
}
c[i]=a[i]-b[i]; //对应位相减
i++;
}
lc=i;
while((c[lc]==0)&&(lc>1)) lc--; //最高位的零0不输出
for(i=lc;i>=1;i--) printf("%d",c[i]);
return 0;
}
高精度乘法
#include <stdio.h>
#include <string.h>
char a1[101],b1[101],a[101],b[101],c[10000];
int la,lb,lc,x,i,j;
int main(){
la=strlen(gets(a1)); //输入乘数
lb=strlen(gets(b1)); //输入被乘数
for(i=0;i<=la-1;i++) a[la-i]=a1[i]-'0'; //倒序存储
for(i=0;i<=lb-1;i++) b[lb-i]=b1[i]-'0';
for(i=1;i<=la;i++){
x=0; //用于存放进位
for(j=1;j<=lb;j++){ //对乘数的每一位进行处理
c[i+j-1]=a[i]*b[j]+x+c[i+j-1]; //当前乘积+上次乘积进位+原数
x=c[i+j-1]/10; //计算进位
c[i+j-1]%=10; //
}
c[i+lb]=x; //进位
}
lc=la+lb; //确定最终结果总长度
while((c[lc]==0)&&(lc>1)) lc--; //最高位的零0不输出
for(i=lc; i>=1; i--) printf("%d",c[i]);
return 0;
}
高精除以低精
#include <stdio.h>
#include <string.h>
char a1[301];
int a[301],c[301];
int la,lc,x,i,b;
int main(){
la=strlen(gets(a1));
scanf("%d",&b);
for(i=0;i<=la-1;i++) a[i+1]=a1[i]-'0';
for(i=1;i<=la;i++){
c[i]=(x*10+a[i])/b;
x=(x*10+a[i])%b;
}
lc=1;
while((c[lc]==0)&&lc<la) lc++;
for(i=lc;i<=la;i++) printf("%d",c[i]);
return 0;
}
高精除以高精
#include <stdio.h>
#include <string.h>
int a[501],b[501],c[501],d,i,s;
int in(int a[]){ //输入
char s[501];
gets(s); //读入字符串
a[0]=strlen(s); //用a[0] 计算字符串s的位数
for(i=1;i<=a[0];i++) a[i]=s[a[0]-i]-'0'; //将数串s转换成数组a,并倒序存储
}
int put(int a[]){ //打印输出
int i;
if(a[0]==0){ //字符长度为0,输出0
putf("0\n");
return 0;
}
for(i=a[0];i>0;i--) putf("%d",a[i]); //倒序输出
putf("\n");
return 0;
}
int cmp(int a[],int b[]){ //比较ab的大小关系,如果a大于b为1,a等于b为0,a小于b为-1
int i;
if(a[0]>b[0]) return 1; //长度不相等,则两数组肯定不相等
if(a[0]<b[0]) return -1;
for(i=a[0];i>0;i--){ //从高位到低位进行比较
if(a[i]>b[i]) return 1;
if(a[i]<b[i]) return -1;
}
return 0;
}
int jian(int a[],int b[]){ //计算a=a-b
int flag,i;
flag=cmp(a,b); //调用比较函数判断大小
if(flag==0){ //除数等于被除数,余数肯定为零
a[0]=0;return 0;
}
if(flag==1){ //大于
for(i=1;i<=a[0];i++){
if(a[i]<b[i]){
a[i+1]--;a[i]+=10; //不够减则向上借一位
}
a[i]-=b[i];
}
while(a[0]>0&&a[a[0]]==0) a[0]--; //修正a的位数
return 0;
}
}
void cpy(int p[],int q[],int t){//复制p数组到q数组从t开始的地方
int i;
for(i=1;i<=p[0];i++) q[i+t-1]=p[i];
q[0]=p[0]+t-1;
}
int f(int a[],int b[],int c[]){
int i,t[501];
c[0]=a[0]-b[0]+1;
for(i=c[0];i>0;i--){
memset(t,0,sizeof(t));
cpy(b,t,i);
while(cmp(a,t)>=0){
c[i]++;jian(a,t);
}
}
while(c[0]>0&&c[c[0]]==0) c[0]--;
return 0;
}
int main(){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
in(a);in(b); //输入被除数a与除数b
f(a,b,c);
put(c); //输出结果
put(a); //输出余数
return 0;
}
回文数
#include <stdio.h>
#include <string.h>
int a[101],b[101],n,i,ans;
int in(int a[]){
char t[101];
memset(a,0,sizeof(a));
scanf("%d",&n);
a[0]=strlen(gets(t));
for(i=1;i<=a[0];i++){
if(t[a[0]-i]>='0'&&t[a[0]-i]<='9') a[i]=t[a[0]-i]-'0';
else a[i]=t[a[0]-i]-'A'+10;
}
}
int det(int a[]){
for(i=1;i<=a[0];i++)
if(a[i]!=a[a[0]-i+1]) return 0;
return 1;
}
int jia(int a[]){
int i,k;
for(i=1;i<=a[0];i++) b[i]=a[a[0]-i+1];
for(i=1;i<=a[0];i++) a[i]+=b[i];
for(i=1;i<=a[0];i++){
a[i+1]+=a[i]/n;
a[i]%=n;
}
if(a[a[0]+1]>0) a[0]++;
}
int main(){
in(a);
if(det(a)){
printf("0\n");return 0;
}
ans=0;
while(ans<=30){
ans++;
jia(a);
if(det(a)){printf("%d\n",ans);return 0;}
}
printf("Impossible");
return 0;
}
大整数的因子
#include <stdio.h>
#include <string.h>
int det(int d[],int k,int len){
int ans=0,mod=0,i=0;
while(i<len){
mod=(mod*10+d[i])%k;
i++;
}
if(mod==0) ans=1;
return ans;
}
int main(){
int mod=0,i,k,d[31],flag;
char s[31];
int len=strlen(gets(s));
for(i=0;i<len;i++) d[i]=s[i]-'0';
for(k=2;k<=9;k++){
if(det(d,k,len)){
if(flag==1) printf(" ");
printf("%d",k);
flag=1;
}
}
if(flag==0) printf("none");
return 0;
}
求10000以内n的阶乘
#include <stdio.h>
int a[1000000]={1,1},len=1;
int main() {
int n,i,j,x;
scanf("%d",&n);
for(i=1;i<=n;i++){
x=0; //用于存放进位
for(j=1;j<=len;j++){ //对乘数的每一位进行处理
a[j]=a[j]*i+x;
x=a[j]/10;
a[j]%=10;
if(x>0&&j==len) len++;
}
}
for(i=len;i>=1;i--) printf("%d",a[i]);
return 0;
}