高精度加剪乘

#include<stdio.h>
#include <cstring>
char n[255],m[255];
int n1[255],m1[255],s[510];
int bigjia(char *a,char *b)
{
    int a1[500],b1[500];
    int i,j,k=0,t;
    int lena=strlen(a);
    int lenb=strlen(b);
    for(i=0; i<lena; i++)
        a1[i]=a[i]-48;
    for(j=0; j<lenb; j++)
        b1[j]=b[j]-48;
    while(i>=0&&j>=0)
    {
        s[k]=a1[i]+b1[j];
        k++;
        i--;
        j--;
    }
    if(i>=0)
        while(i>=0)
        {
            s[k]=a1[i];
            k++;
            i--;
        }
    else if(j>=0)
        while(j>=0)
        {
            s[k]=b1[j];
            k++;
            j--;
        }
    for(t=1; t<k; t++)
        if(s[t]>=10)
        {
            s[t]%=10;
            s[t+1]++;
        }
    while(s[k]==0)
        k--;
    return k;
}
int bigcheng(char *n,char *m)
{
    int k=0,t,x=0,dig;
    int lenn=strlen(n);
    int lenm=strlen(m);
    for(int i=0; i<lenn; i++)
        n1[i]=n[i]-48;
    for(int j=0; j<lenm; j++)
        m1[j]=m[j]-48;
    for(int j=lenm-1; j>=0; j--)
    {
        t=k;
        for(int i=lenn-1; i>=0; i--)
        {
            s[t]+=n1[i]*m1[j];
            t++;
        }
        ++k;
        dig=t;
    }
    for(int i=0; i<dig; i++)
        while(s[i]>=10)
        {
            s[i]-=10;
            ++s[i+1];
        }
    return dig;
}
void exch_str(char*s1,char*s2)
{
    char tmp[1001];
    strcpy(tmp,s1);
    strcpy(s1,s2);
    strcpy(s2,tmp);
}
void bigjian(char *a,char *b)
{
    int a1[1001]= {0},b1[1001]= {0},s[1001]= {0},sign=1;
    int len_a,len_b,i,j,k=0,t;
    len_a=strlen(a);
    len_b=strlen(b);
    if(len_a<len_b)
    {
        sign=-1;
        exch_str(a,b);
        t=len_a;
        len_a=len_b;
        len_b=t;
    }
    else if(len_a==len_b)
    {
        for(i=0; i<len_a; ++i)
        {
            if(a[i]>b[i])
            {
                sign=1;
                break;
            }
            else if(a[i]<b[i])
            {
                sign=-1;
                exch_str(a,b);
                break;
            }
        }
    }
    else
    {
        sign=1;
    }
    for(i=0; i<len_a; ++i)
    {
        a1[i]=a[i]-'0';
    }
    for(j=0; j<len_b; ++j)
    {
        b1[j]=b[j]-'0';
    }
    while(i>=0&&j>=0)
    {
        s[k]=a1[i]-b1[j];
        if(s[k]<0)
        {
            a1[i-1]-=1;
            s[k]+=10;
        }
        k++;
        i--;
        j--;
    }
    while(i>=0)
    {
        s[k]=a1[i];
        k++;
        i--;
    }
    if(sign<0)
        printf("-");
    while(s[k]==0&&k>0)
    {
        k--;
    }
    if(k==0)
        printf("0");
    while(k>0)
    {
        printf("%d",s[k]);
        k--;
    }
}
int main()
{
    scanf("%s%s",&n,&m);
    int l=bigjia(n,m);
    for(int i=l; i>0; i--)
        printf("%d",s[i]);
    puts("");
    memset(s,0,sizeof(s));
    int ll=bigcheng(n,m);
    if(s[ll]!=0)
        for(int i=ll; i>=0; i--)
            printf("%d",s[i]);
    else
        for(int i=ll-1; i>=0; i--)
            printf("%d",s[i]);
    puts("");
    memset(s,0,sizeof(s));
    bigjian(n,m);
    return 0;
}

时间: 2024-07-31 20:12:15

高精度加剪乘的相关文章

poj 2756 Autumn is a Genius 高精度加减

题意: 求a+b.-10^50000<a,b<32768. 分析: 题目描述很猥琐,其实要用高精度的,用高精度加减模板. 代码: //poj 2756 //sep9 #include <iostream> using namespace std; const int maxN=60000; char A[maxN],B[maxN]; int L,flag1,flag2,flag3,a[maxN],b[maxN],c[maxN]; void ini() { L=max(strlen(

高精度加、减及混合

我们知道,减法在本质上其实是加法,就是把数字前的负号当成这个数字的组成部分 那么,如何实现真正的高精度加法呢(即需要考虑负数的情况)? 一步一步来吧! PART1: 有两个很大的非负整数,大概有10^1000的位数那么大,求和? 这就是很纯的高精度加法,即不用考虑负数的情况,实现如下: 1 void add(BigNum *x,BigNum *y,BigNum *z){ 2 z->len=max(x->len,y->len); 3 for(int i=1;i<=z->len;

2016/7/6 准&#183;高精度计算器-加

使用函数库: #include<stdio.h>#include<string.h>#include<stdlib.h> 源码(加法): #include<stdio.h>#include<string.h>#include<stdlib.h>int main(void){ char s1[100],s2[100],s3[100],s4[100],s5[100],s6[100]; //由于是分总程序,请忽略多余 long n=-1,n

简单高精度加法

[高精度]简单高精度加 题目描述 修罗王解决了计算机的内存限制问题,终于可以使用电脑进行大型的魔法运算了,他交给邪狼的第一个任务是计算两个非负整数A.B的和,其中A和B的位数在5000位以内. 输入 共两行数据,第一行为一个非负整数A,第二行为一个非负整数B,A.B的位数均在5000以内. 输出 输出一个非负数,即两数之和. 样例输入 1111111111 2222222222 样例输出 3333333333 #include <bits/stdc++.h> #define N 5000 #d

[leetcode]66. Plus One加一

Given a non-empty array of digits representing a non-negative integer, plus one to the integer. The digits are stored such that the most significant digit is at the head of the list, and each element in the array contain a single digit. You may assum

[题解+总结]20151010

1.前言 又是绿书上的题目.这种画风感觉还是好些的,虽然都是远古时代的.今天题目感觉难度适中,但是太过于偏向动态规划了吧...还有搜索傻逼题乱入. 2.Sort 产品排序 大概题意:给出n个产品,每个产品有加工时间和冷却时间.现有两台加工机,每台加工机同一时间只能加工一个产品.产品加工完后就进入冷却时间.要求在尽可能短的时间内完成所有产品的所有工序,求最短时间. 题解: 动态规划.设存在两个产品x和y,y的冷却时间大于x,且x排在y之前.如果x和y是相邻的,可以发现在这种情况下完成时间是max{

[题解+总结]20150903

1.前言 考得稀下的,算了不说了. 2.Password 博士的密码 大概题意:给出一个数列,选出其中一些数字使其和为所给数字. 总结:被这道题坑死了!为了省时间,我事先排了序并且用了前缀和优化,但是它的数列存在负数,而且是所有数据都有负数,所以直接爆零无话可说.后来再看了一眼题目发现好像确确实实没有说一定是正整数. 题解:题解是非常鬼畜的.说先前60%直接暴力DFS即可(妈蛋):然后注意100分为n<=40.暴力显然是O(n!)的,所以当n>25时,我们可以把n个数分成两个部分,首先暴力算出

bzoj 2401: 陶陶的难题I 数论

2401: 陶陶的难题I Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 89  Solved: 24[Submit][Status] Description 最近陶陶在研究数论,某天他偶然遇到一道题:对于给定的正整数???,求出 下面这样一个式子的值: 其中LCM(a???, b???)表示正整数???和???最小公倍数,即能同时被a???和b???整除的最小正 整数. 作为神犇的陶陶,当然轻松秒杀了这道题.不过他希望你写一个程序,用来 检验他算

hdu1000,hdu1001,hdu1002,hdu1003

hdu1000 仅仅是为了纪念 1 #include <cstdio> 2 int main() 3 { 4 int a,b; 5 while (scanf("%d%d",&a,&b)!=EOF) 6 { 7 printf("%d\n",a+b); 8 } 9 return 0; 10 } hdu1001 题目说n*(n+1)/2 不不会爆 但是没和你说n*(n+1)不会爆 用下面这个小方法解决  见代码 #include <ios