大整数问题得求解 大整数的加法 计算2的n次方

大整数的加法
http://noi.openjudge.cn/ch0106/10/
模拟算术

#include
#include
#define maxn 10000
using namespace std;
int ans[maxn];
int main()
{
    char s1[maxn];
    char s2[maxn];
    cin>>s1>>s2;
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int ptr = 0;//结果数组
    int carry = 0;//进位
    int i,j;
    //从最低位开始加
    for(i=len1-1,j=len2-1;i>=0||j>=0;i--,j--)//这里用或者的原因:两个都得算完才能出去
    {
        int x = carry;
        if(i>=0)//s1如果还有数
        {
            x+=s1[i]-'0';
        }
        if(j>=0)//s2如果还有数
        {
            x+=s2[j]-'0';
        }
        ans[ptr++]=x%10;
        carry = x/10;
    }
    //如果有最高位进位
    if(carry)
        ans[ptr++]= carry;
    int flag = 1;//处理一下特殊用例  00000+00000
    for(i=ptr-1;i>=0;i--)
    {
        //前导0不能输出
        if(!ans[i]&&flag){
            continue;
        }
        flag = 0;
        printf("%d",ans[i]);
    }
    //全是0的情况
    if(flag)
        printf("0\n");

    return 0;
}

计算2的n次方
http://noi.openjudge.cn/ch0106/12/

#include
using namespace std;
int a[1010];
int main()
{
    int n,i;
    cin>>n;
    int l=1;//指向最高位的后一位
    a[0]=2;
    for(i=1;ifor(int j=0;j2;
        for(int j=0;j1]+=a[j]/10;
            a[j] = a[j]%10;
        }
        //如果a[l]不等于零  说明进位了,l往后移动
        if(a[l]!=0)
            l++;
    }
    for(int j=l-1;j>=0;j--)
    {
        cout<cout<return 0;
}

求10000以内n的阶乘
http://noi.openjudge.cn/ch0106/14/

#include
#define maxn 40010
using namespace std;
int result[maxn];
int main()
{
    int num;
    cin>>num;
    int index = 1;//最高位的位置
    result[0]=1;
    for(int i=1;i<=num;i++)
    {
        int carry=0;
        for(int j=0;jint tmp = result[j]*i+carry;//i  1~~~num  很大  相乘得到carry会很大
            result[j] = tmp %10;
            carry = tmp/10;
        }
        //为什么要while处理  i  1~~~num  很大  相乘得到carry会很大,所以要用while处理一下
        while(carry)
        {
            result[index++] = carry%10;
            carry/=10;
        }
    }
    for(int i=index-1;i>=0;i--)
        cout<cout<return 0;
}

你可能感兴趣的:(大整数)