两个很大的数相乘

#include <iostream>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
const int maxN=200;
char s1[maxN],s2[maxN];
int a[maxN],b[maxN];
int **ans=new int*[maxN];
int ret[2*(maxN+1)];
int main()
{
    int len1,len2,i,j,k,k1,k2,num,sum,over;
    while(scanf("%s%s",s1,s2)!=EOF)
    {
        len1=strlen(s1);
        len2=strlen(s2);
        k1=0;
        for(i=len1-1; i>=0; i-=4)
        {
            sum=0;
            for(j=i; j>i-4&&j>=0; j--)
            {
                num=s1[j]-‘0‘;
                for(k=i-j; k>0; k--)
                    num*=10;
                sum+=num;
            }
            a[k1++]=sum;
        }
        k2=0;
        for(i=len2-1; i>=0; i-=4)
        {
            sum=0;
            for(j=i; j>i-4&&j>=0; j--)
            {
                num=s2[j]-‘0‘;
                for(k=i-j; k>0; k--)
                    num*=10;
                sum+=num;
            }
            b[k2++]=sum;
        }

        /*
        for(i=k1-1; i>=0; i--)
            cout<<a[i]<<" ";
        cout<<endl;
        for(i=k2-1; i>=0; i--)
            cout<<b[i]<<" ";
        cout<<endl;
        */
        for(i=0; i<maxN; i++)
        {
            ans[i]=new int[2*(maxN+1)];
            memset(ans[i],0,sizeof(int)*2*(maxN+1));
        }
        for(i=0; i<k1; i++)
        {
            over=0;
            k=i;//expansion 10^(4*i)
            for(j=0; j<k2; j++,k++)
            {
                ans[i][k]=a[i]*b[j]+over;
                over=ans[i][k]/10000;
                ans[i][k]%=10000;
            }
            if(over)
                ans[i][k]=over;
        }
        /*
        for(i=0; i<k1; i++)
        {
            for(j=2*(maxN+1)-1; j>=0; j--)
                if(ans[i][j])
                    break;
            if(j==-1)
            {
                printf("0\n");
                continue;
            }
            printf("i= %d , j= %d , ans[i][j] = %d\n",i,j,ans[i][j]);
            for(j-=1; j>=0; j--)
                printf("%04d",ans[i][j]);
            printf("\n");
        }
        */
        memset(ret,0,sizeof(ret));
        for(i=0; i<k1; i++)
        {
            over=0;
            for(j=0; j<2*(maxN+1); j++)
            {
                ret[j]+=ans[i][j]+over;
                over=ret[j]/10000;
                ret[j]%=10000;
            }
        }
        for(i=2*(maxN+1)-1; i>=0; i--)
            if(ret[i])
                break;
        if(i==-1)
        {
            printf("0\n");
            continue;
        }
        printf("%d",ret[i]);
        for(i-=1; i>=0; i--)
        {
            printf("%04d",ret[i]);
        }
        printf("\n");
    }
    return 0;
}
时间: 2024-10-21 15:32:09

两个很大的数相乘的相关文章

打印/输入很大的数的方法

有2种方法: (1)长的数据,一般(数据)变量(int long double等)是存不下的,因此,只能存成字符串 char num[128]="1606938044258990275541962092341162602522202993782792835301376" ; cout << num <<endl ; //完成输出! C++ 或 printf( "%s\n", num );//完成输出! C/C++(2)对于64位的大数字:如1

利用map可以对很大的数出现的次数进行记数

Problem Description In the year 8888, the Earth is ruled by the PPF Empire . As the population growing , PPF needs to find more land for the newborns . Finally , PPF decides to attack Kscinow who ruling the Mars . Here the problem comes! How can the

输入两个很大的正数(用C字符串表示),输出他们的乘积,将设不考虑非法输入。

1 #include<iostream> 2 #include<cassert> 3 void multiply(const char *a,const char *b) 4 { 5 assert(a!=NULL && b!=NULL); 6 int i,j,ca,cb,*s; 7 ca=strlen(a); 8 cb=strlen(b); 9 s=(int *)malloc(sizeof(int)*(ca+cb)); //分配存储空间 10 for(i=0;i&l

创建一个很大的EMP表 EMP_LARGE

--CREATE TABLE EMP_LARGE AS SELECT * FROM EMP ; ---先复制一张EMP表 DECLARE --声明变量 v_loop NUMBER; v_num NUMBER; too_large EXCEPTION; BEGIN --开始执行 FOR v_loop IN 1 .. 100 LOOP --EMP开始是14条,14*2^100应该是很大的数了吧 SELECT COUNT(*) INTO v_num FROM emp_large; IF v_num <

舍罕王的失算-(处理很大的数据)

1056: [C语言训练]舍罕王的失算 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 276  Solved: 248[Submit][Status][BBS] Description 相传国际象棋是古印度舍罕王的宰相达依尔发明的.舍罕王十分喜爱象棋,决定让宰相自己选择何种赏赐.这位聪明的宰相指着8*8共64格的象棋说:陛下,请您赏给我一些麦子吧.就在棋盘的第1格放1粒,第2格放2粒,第三格放4粒,以后每一格都比前一格增加一位,依此放完棋盘一64格

为何很大的浮点大数加一个很小的数计算结果不是预期

通常浮点数被表示成N=S*rj S称为尾数,可正可负,j称为阶码可正可负.r是基数,在计算机中取以2的倍数. 计算机中为了提高精度,进行规格化操作:即假设N=11.0101  则规格化表示为N=0.110101*210表示,因为该规格化使得浮点数的表示精度最高. 机器中浮点数由两部分组成:阶码和尾数.基数为2 阶码由阶符跟阶码组成,尾数由数符跟尾数组成 其中阶码是整数,阶符和阶码的位数m合起来反映浮点数的表示范围及小数点的实际位数.尾数是小数,其位数反映了浮点数的精度. 还有机器零这个概念:即浮

Java 递归解决 &amp;quot;仅仅能两数相乘的计算器计算x^y&amp;quot; 问题

/** * 求一个数的乘方 * 求x^y,y是一个正整数. 设计算器仅仅能计算两数相乘,不能一次计算n个数相乘. * 知:2^5=(2^2)^2*2; 2^6=(2^2)^3=((4)^2)*4; 2^8=(2^2)^4= (4^2)^2= 16^2 * 得到规律:x^y= (x^2)^(y/2),定义a=x^2,b=y/2, 则得到形如: x^y= a^b; * y假设是奇数,则分解的最后还要再乘以a(如上面2^6分解成4^3时):x^y=a^b*x. * * 用递归来解:那么每次x都传入一个

【C语言】用函数指针变量完成:输入两个整数,让用户选择函数,选择1输出较大的数,选择2输出较小的数

<pre name="code" class="cpp">//用函数指针变量完成:输入两个整数,让用户选择函数,选择1输出较大的数,选择2输出较小的数 #include <stdio.h> int max(int x,int y) { return (x>y)?x:y; } int min(int x,int y) { return (x>y)?y:x; } int main() { int (*p)(int,int); int

编程题:返回指针值的函数,求两个数中较大的数。

#include<stdio.h> int *max(int *x,int *y) { int *q; if(*x>*y)  q=x; else  q=y; return q; } void main() { int a,b,*p; scanf("%d,%d",&a,&b); p=max(&a,&b); printf("%d,%d,max is %d\n",a,b,*p); } 编程题:返回指针值的函数,求两个数中较