poj水题-1001 一个简单的大数乘幂算法实现

  说到底就是一个大数乘幂运算,小数点后零。明白大数乘幂算法直接搞。

  这里就有几个问题:

  1.幂位数小可以用二进制容器表示(取模更好,但我是为了练习STL)

  2.n位大数用string表示,外加一个int型表示小数点位置

  3.字符串×字符串用小学竖式乘法算法就行,注意补零。位数多时两个string两个string地加。

  代码长,但理解容易,大数乘法,加法函数很多都能重用。

  1 #include <iostream>
  2 #include <vector>
  3 #include <string>
  4 #include <strstream>
  5
  6
  7 using namespace std;
  8
  9 string Str_Char_Muti(const string & str,const char c)
 10 {
 11     int Len = str.length();
 12     int mutitemp=0,addtemp=0;
 13     int i;
 14     string aim =str;
 15     for(i = 0;i<Len;++i)
 16     {
 17         mutitemp = (c -‘0‘)*(str[i]-‘0‘)+addtemp;
 18         aim[i] =(char) (mutitemp%10 +‘0‘);
 19         addtemp = mutitemp /10;
 20     }
 21     if(addtemp != 0)
 22         aim = aim +(char) (addtemp+‘0‘);
 23     return aim;
 24 }
 25 string Str_Add(const string &str_1,const string &str_2)
 26 {
 27     if("0" ==str_1)
 28         return str_2;
 29     if("0"==str_2)
 30         return str_1;
 31     int Llen,Slen;
 32     string copy_1 = str_1;
 33     string copy_2 = str_2;
 34     if(str_2.length()>str_1.length())
 35     {
 36         Slen = str_1.length();
 37         Llen = str_2.length();
 38         for(int i=0;i<Llen-Slen;++i)
 39         {
 40             copy_1 +=‘0‘;
 41         }
 42     }
 43     else
 44     {
 45
 46         Slen = str_2.length();
 47         Llen = str_1.length();
 48         for(int i=0;i<Llen-Slen;++i)
 49         {
 50             copy_2 +=‘0‘;
 51         }
 52     }
 53
 54     int addtemp=0,jin =0;
 55     string aim (Llen ,‘0‘);
 56     int i;
 57     for(i=0 ; i<Llen ; ++i)
 58         {
 59             addtemp =( (copy_1[i] -‘0‘)+(copy_2[i]-‘0‘) )+jin;
 60             jin = addtemp /10;
 61             aim[i] =(char)( addtemp % 10 + ‘0‘ );
 62         }
 63     if(jin != 0)
 64     aim += (char) ( jin+‘0‘ );
 65
 66     return aim;
 67
 68 }
 69 string Str_Muti(const string &str_1,const string& str_2)
 70 {
 71     string aim = "0";
 72     string temp = "0";
 73     if(str_1=="1")
 74         return str_2;
 75     if(str_2=="1")
 76         return str_1;
 77     int Len_1 = str_1.length();
 78     int Len_2 = str_2.length();
 79     aim = "0";
 80     for(int i=0;i<Len_2;++i)
 81     {
 82         temp = Str_Char_Muti(str_1,str_2[i]);
 83         for(int j=0;j<i;++j)
 84         {
 85                 temp = ‘0‘+ temp;
 86         }
 87
 88         aim = Str_Add(aim,temp);
 89     }
 90     return aim;
 91 }
 92 string delete_0(const string &str ,int pos )
 93 {
 94     string aim;
 95     int i=0;
 96     if(pos<str.length())
 97     {
 98         while(str[i] == ‘0‘&&i<=pos)
 99             i++;
100         if(i<pos)
101         {
102             string head(str,i,pos-i);
103             string rear(str,pos,str.length()-pos);
104             string r ="";
105             for(int j=0;j<rear.length();++j)
106                 if(‘0‘!= rear[j])
107                 {
108                     r = rear;
109                     break;
110                 }
111             aim = head +‘.‘+r;
112
113         }
114         else
115         {
116             string a(str,pos,str.length()-1);
117             aim = a;
118         }
119     }
120     else
121     {
122         aim = str;
123         int a = pos-str.length() ;
124         while(a--)
125         {
126             aim = aim +‘0‘;
127         }
128         aim = aim + ‘.‘;
129     }
130     return aim;
131 }
132 int main ()
133 {
134
135     int n;
136     int pos;
137     string s;
138     string str_a;
139     string one ="1";
140     while(cin>>s>>n)
141     {
142         pos = 0;
143         str_a = "";
144         string sum ="1";
145         for(int i= 0;i<6;++i)
146             {
147                 if(‘.‘==s[i])
148                     pos = 5-i;
149                 else str_a = s[i] +str_a;
150             }
151
152         vector <string> di;
153         pos = pos *n;
154         while(n!=0)
155         {
156             if(n%2==1)
157             {
158                 di.push_back(str_a);
159             }
160             else
161             {
162                 di.push_back(one);
163             }
164             str_a = Str_Muti(str_a,str_a);
165             n = n/2;
166         }
167
168         for(int i=0;i<di.size();++i)
169         {
170             sum = Str_Muti(sum,di[i]);
171         }
172
173             str_a = delete_0(sum,pos);
174
175         for(int i=str_a.length()-1;i>-1;--i)
176         {
177             cout<<str_a[i];
178         }
179             cout<<endl;
180     }
181     return 0;
182 }

poj水题-1001 一个简单的大数乘幂算法实现

时间: 2024-08-03 23:53:41

poj水题-1001 一个简单的大数乘幂算法实现的相关文章

poj水题-1002 STL是神器,得用啊

很简单的一个,就是总超时.问题出在我使用的短平快,简单直接的方式已经不灵了. 这种情况我总结以下原因: 1.尽量用STL模板容器,qsort()等内置,他们优化得很好 2.不用的话需要了解哈希算法. 本题用了快排与哈希,自己写也行(麻烦),不写的话用qsort与STL map,否则超时.我用的当然是模板,短平快解决战斗. #include <iostream> #include <map> #include <string> using namespace std; s

poj水题-3062 超级水题的深层理解——代码简化

题目很简单,要求输入什么样输出什么样.以回车结束 这就是我用的C代码 #include <stdio.h> int main (){char p;for(;gets(&p);)puts(&p);return 0;} 使用了代码简化方案,我简化到了75B.有大神简化到31B,真想看看他们的源代码.我估计他们比我个能够了解语言规则. 这里不得不说一本叫<短码之美>的书.介绍了这道题.但我试过了,没用.可能系统升级了吧,必须要求C99. ,还听说不用#include也行,

【转载】POJ水题大集合

POJ水题大集合 poj1000:A+B problempoj1002:电话上按键对应着数字.现在给n个电话,求排序.相同的归一类poj1003:求最小的n让1+1/2+1/3+...+1/n大于给的一个实数poj1004:求一堆实数的平均数poj1005:由坐标 (0,0) 开始,以半圆为形状每年侵蚀50m^2,问(0,0)开始到(x,y)结束需要多长时间poj1006:三个周期是常数.现在给三个周期出现高峰的时候,问下一次出现高峰是什么时候poj1007:求字符串排序poj1008:一种日历

poj水题-1579 将递归记录会变快

短平快递归肯定卡死,这里需要了解一个情况. 1.递归是否在很多情况再做重复工作? 2.由递归生成的“大面积数据”是否是由“小范围数据”组合而来? 如果都回答“是”.就强烈推荐“记笔记方式”.如果有笔记记录,那么查笔记,否则递归. #include <stdio.h> long s[21][21][21] = {0}; int w(int a,int b,int c) { if (a <= 0 || b <= 0 || c <= 0) return s[0][0][0]=1;

一个简单的伪随机数发生算法(转)

源:一个简单的伪随机数发生算法 //此代码纯属交流目的,如用作安全领域,后果自负 #include <stdint.h> #include <stdlib.h> //! \brief random seed static uint16_t s_hwRandomSeed = 0xAA55; static uint8_t s_chRandomTable[] = { 0x12,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF, 0xF1,0xE2,0xD3,0xC4,

就一个简单的大数计算

也只是刚刚写出了加法,用的是1 000 000 000进制,不过发现对于加法还不如用最基本的方法方便.用1 000 000 000进制的方便也就在于处理乘法和除法了.计算机做乘除运算还是比较耗时的. #include <random> #include <iostream> #include <fstream> #include <string> #include <vector> #include <utility> using n

实现一个简单的轮询算法

前言 负载均衡,大家应该听的也不少了,也实践过N次了. 当然也会知道,负载均衡是有不少算法的:随机,轮询,加权轮询,最少连接.... 本文重点说的是轮询. 先举个例子看看轮询算法是如何运作的. 假设我们的API站点有3台负载(10.0.10.1,10.0.10.2和10.0.10.3),客户端第一次请求API的时候,会访问.1拿到结果,第二次会访问.2拿到结果,第三次则会访问.3拿到结果,后面就是依次类推. 在致就是这个样子的访问顺序. .1->.2->.3>.1>.2......

#82. 【UR #7】水题生成器

链接:http://uoj.ac/problem/82 今天是世界水日,著名的水题资源专家蝈蝈大臣向世界宣布了他的一项新发明 -- 水题生成器. 每道题目都有一个正整数的难度值.水题生成器虽然强大但是功能有限.水题生成器内部有一个参数 nn,你可以告诉水题生成器一个能整除 n!n! 的正整数 dd,水题生成器就会产生一道难度值恰为 dd 的水题.这里 n!n! 表示 nn 的阶乘. 现在蝈蝈大臣的助手欧姆想用水题生成器产生不超过 nn 道水题,且难度值之和恰为 mm.保证 1≤m≤n!1≤m≤n

POJ 3069 Saruman&#39;s Army(水题,简单的贪心)

[题意简述]:在一条直线上有N个点,每个点的位置分别是Xi,现从这N个点中选择若干个点给他们加上标记.使得,对每个点而言,在其距离为R的范围内都有带有标记的店,问   至少   要有几个被标记的点. [分析]:我们可以对这个点的序列简单的排序,按照从左到右,从小到大,然后对于最左边的这一个点,我们计算从这个点开始加上这个距离R可以到达的最远的但又小于这个距离R的点是哪一个,然后以这个点为基准,重复上述的过程,最终计算出点的个数. 详见代码: //244K 63Ms #include<iostre