首先,我们来看一下C语言中各类型的最值:
unsigned int 0~4294967295
int -2147483648~2147483647
unsigned long 0~4294967295
long -2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615
高精度加法
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
int main(){
int a[10010],b[10010],c[10010]; //a,b用来存放两个数,c用来存放加的数
char a1[10010],b1[10010]; //以字符串的形式输入,方便读取位数
scanf("%s%s",a1,b1);
int la = strlen(a1),lb = strlen(b1);
int max = la>lb?la:lb; //求最大位数
int i,j;
for(i = 0;i<la;i++){
a[i] = a1[la-i-1] - '0';//将低位放前面,高位放后面,以便进位
}
for(j = 0;j<lb;j++){
b[j] = b1[lb-j-1] - '0';
}
for(i = 0;i<max;i++){
c[i] += a[i]+b[i];
if(c[i]>=10){
c[i+1]++;
c[i] -= 10;
}
}
while(c[max]==0&&max>=1){ //因为c数组是从0下标开始,那么如果不进位是m-1。
max--; //如果进位就是第m下标
}
for(i = max;i>=0;i--){ //倒序输出
printf("%d",c[i]);
}
return 0;
}
输出的时候判断第一位是否为0有另外一个方法
int flag = 0;
for(i = max;i>=0;i--){
if(c[i])
flag = 1;
if(flag)
printf("%d",c[i]);
}
if(flag==0) printf("0");
高精度减法
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
int main(){
int a[10010],b[10010],c[10010]; //a,b用来存放两个数,c用来存放加的数
char a1[10010],b1[10010],temp[10010]; //以字符串的形式输入,方便读取位数
scanf("%s%s",a1,b1);
int la = strlen(a1),lb = strlen(b1);
int max = la>lb?la:lb; //求最大位数
//判断结果为正还是为负,负的话交换数据
if(la<lb || (la==lb)&&strcmp(a1,b1)<0){
strcpy(temp,a1);
strcpy(a1,b1);
strcpy(b1,temp);
printf("-");
}
int i,j;
for(i = 0;i<la;i++){
a[i] = a1[la-i-1] - '0';//将低位放前面,高位放后面,以便进位
}
for(j = 0;j<lb;j++){
b[j] = b1[lb-j-1] - '0';
}
for(i = 0;i<max;i++){
c[i] += a[i]-b[i];
if(c[i]<0){
c[i+1]--;
c[i] += 10;
}
}
int flag = 0;
for(i = max;i>=0;i--){
if(c[i])
flag = 1;
if(flag)
printf("%d",c[i]);
}
if(flag==0) printf("0");
return 0;
}
任意给定一个正整数N(N<=100),计算2的n次方的值。
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
int main(){
int a[10010],n,k=1; //k来表示位数
a[1]=1;
scanf("%d",&n);
for(int i = 0;i<n;i++){
//循环n次,每一次*2
int j,num=0;
for(j = 1;j<=k;j++){
a[j] =a[j]*2+num;
num = a[j]/10;
a[j] %= 10;
if(num!=0 && j==k)//为什么要j==k?
k++; //计算到最高位并且有进位,长度加1
}
}
for(int i = k;i>0;i--){
printf("%d",a[i]);
}
return 0;
}