高精乘

高精度练习之乘法

【题目描述】给出两个正整数A和B,计算A*B的值。保证A和B的位数不超过500位。

【输入描述】读入两个用空格隔开的正整数

【输出描述】输出A*B的值

【样例输入】3 12

【样例输出】36

【数据范围】两个正整数的位数不超过500位

思路:就是高精乘高精

program aa;
var l1,l2,lm,i:longint;
    a,b:array[1..500]of integer;
    c:array[1..1000]of longint;
procedure init;
var ch:char;
    a1,b1:array[1..500]of longint;
    c,i:longint;
    s:ansistring;
begin
    while 1<>0 do
    begin
        read(ch);
        if ch=‘ ‘ then break;
        inc(l1);
        val(ch,a1[l1],c);
    end;
    repeat
        read(ch);
    until ch<>‘ ‘;
    val(ch,b1[1],c);
    readln(s);
    l2:=length(s)+1;
    for i:=2 to l2 do val(s[i-1],b1[i],c);

    for i:=1 to l1 do a[i]:=a1[l1+1-i];
    for i:=1 to l2 do b[i]:=b1[l2+1-i];
end;
procedure work;
var i,j,l:longint;
begin
    for i:=1 to l1 do
        for j:=1 to l2 do
        begin
            l:=a[i]*b[j];
            c[i+j-1]:=c[i+j-1]+l;
            inc(c[i+j],c[i+j-1] div 10);
            c[i+j-1]:=c[i+j-1] mod 10;
        end;
    lm:=l1+l2-1;
    if c[l1+l2]<>0 then inc(lm);
    while c[lm]>=10 do
    begin
        inc(lm);
        c[lm]:=c[lm]+c[lm-1]div 10;
        c[lm-1]:=c[lm-1]mod 10;
    end;
end;
begin
    l1:=0;
    l2:=0;
    init;
    work;
    for i:=lm downto 1 do write(c[i]);
    writeln;
end.

一点反思:第一次交的时候,红字部分出错。直接写成了c[i+j-1]:=l。。。

时间: 2024-10-26 04:35:08

高精乘的相关文章

[BZOJ 2729][HNOI2012]排队(排列组合+高精)

Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) Solution 好像必须写压位高精的QAQ 先排n名男生,插空,讨论两名老师插在两个不同的空里的情况和先排在一起再在中间插一名女生的情况 #include<iostream> #include<cstdio> #include<cstring> #include&

BZOJ_1002_[FJOI2007]_轮状病毒(递推+高精)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1002 )*&*(^&*^&*^**()*) 分析 题目是求一种特殊的图的生成树的个数,但是貌似有更一般的算法,等明天再看吧... 只搞懂了打表找规律,然后题推的解法. 随便写个暴力打个表(其实我并不会写,明天再写吧今天好累),找一找规律. 1~14的答案如下 1 5 16 45 121 320 841 2205 5776 15125 39601 103680 271441 71

高精-----各种模板

高精加法 代码 #include<string> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char a[501],b[501]; int x[501],y[501],z[50000]; int main() { cin>>a; cin>

模板——高精系列

存放一下高精的模板 高精加: #include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> using namespace std; int a[1001],b[1001],c[1001],lena,lenb; char a1[1001],b1[1001]; int main(){ gets(a1); gets(b1); lena=strlen(a1); lenb=strlen

c++普通高精加

//作为一名蒟蒻,还请诸位不要吐槽. //第一次打c++高精加,内心有点小激动. //为codevs3116 高精度练习之加法 //程序太简单,就不打注释了. #include<cstdio>#include<cstring>int main(){char s1[600],s2[600];int a1[600],a2[600],a3[600]={0},len1,len2,i;scanf("%s",s1);scanf("%s",s2);len1

高精阶乘

求n!.当n很大的时候,会超出整数的范围. 这里用数组来进行高精阶乘.a[1]是个位,a[2]是十位......依次类推.每次要乘一个数的时候,就从个位(即a[1])开始乘这个数,>10的时候要%10再进位. 1 #include<cstdio> 2 #include<cstring> 3 const int N=100000; 4 5 int a[N]; 6 int i, j, n; 7 int t, pos/*位数*/, carry/*进位*/; 8 9 int main

bzoj 3287: Mato的刷屏计划 高精水题 &amp;&amp; bzoj AC150

3287: Mato的刷屏计划 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 124  Solved: 43[Submit][Status] Description Mato同学喜欢上QQ,但是有少数傻逼总是问他一些弱智问题.Mato感到很反感,想要鄙视一下他们.他决定在QQ上刷屏,也就是发出一大堆字符.Mato的键盘上有4个键:A.B.C.D.按A就会输入一个字符,按B会把所有字符选中,按C会把选中的字符放入剪贴板,按D会插入剪贴板的内容.他的

[贪心][高精]P1080 国王游戏(整合)

题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少.注意,国

codevs 3119 高精度练习之大整数开根 (各种高精+压位)

/* codevs 3119 高精度练习之大整数开根 (各种高精+压位) 二分答案 然后高精判重 打了一个多小时..... 最后还超时了...压位就好了 测试点#1.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms 测试点#2.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms 测试点#3.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms 测试点#4.in 结果:AC 内存使用量: 256kB 时间使用量: 10ms 测试点#5.in 结果:AC 内