“大数处理“
2015-03-17 17:53
239 查看
题目描述:输入数字a,n,计算[a+aa+..+aaaaaa..aaa(n个a)]mod1000000007;
想法:主要利用了模运算的有关规律使得每一个数字计算时都不会溢出。同时将每个a进行分组,有n个a,(n-1)个a0.(0的个数视a的位数定)
代码:
上述算法复杂度较高在1000000,1000000这样的数据时运行时间过长。同学H有了下面的做法。事实证明很多东西需要精心打算
题目的改进:如果最后的结果不取模值
想到的方法。将数字转化为字符串输出,根据a确定亲的进制,从新进制的低位开始算,每次的结果转化为倒序字符串入Stack,然后输出stack中的元素。
想法:主要利用了模运算的有关规律使得每一个数字计算时都不会溢出。同时将每个a进行分组,有n个a,(n-1)个a0.(0的个数视a的位数定)
代码:
#include<stdio.h> long long ComputeBit(long long a) { long long i=10; while(a/10) { i*=10; a=a/10; } return i; }// long long Mode(long long dishu,long long zhishu) { long long i=0; long long moshu=1; while(i<zhishu) { moshu=moshu*dishu%1000000007; i++; } return moshu; } int main() { long long sum=0, a,n,Bit,i,base; while(scanf("%lld%lld",&a,&n)) { sum=0; Bit=ComputeBit(a); for(i=0;i<n;i++) { base=(a*Mode(Bit,i))%1000000007; sum=(sum+((n-i)*base)%1000000007)%1000000007; } printf("%lld",sum); } }
上述算法复杂度较高在1000000,1000000这样的数据时运行时间过长。同学H有了下面的做法。事实证明很多东西需要精心打算
#include <stdio.h> #define M 1000000007u int main() { unsigned a, n; unsigned b; unsigned long long sum; while (scanf("%u%u", &a, &n) ) { b=1; sum=0; unsigned t = a; do { b*=10; t/=10; } while (t); unsigned long long term = a; while (n) { sum += term; term = (term*b+a)%M; n--; } printf("%u\n", sum%M); } return 0; }
题目的改进:如果最后的结果不取模值
想到的方法。将数字转化为字符串输出,根据a确定亲的进制,从新进制的低位开始算,每次的结果转化为倒序字符串入Stack,然后输出stack中的元素。
相关文章推荐
- 初学java之大数处理
- 大数加法(仅能处理正数)
- 宁波工程学院[1409] 鼹鼠鼹鼠你不出来 大数处理 模拟 很好的题
- 棋盘上的麦子(BigInteger处理大数问题)
- NBUT1461 数字整除(大数处理,减法、除法)
- 大数处理之一
- 练习一下用Java处理大数
- java大数处理——转载
- 大数处理----大数相加
- POI设置Excel表格的单元格格式及处理大数的科学计数问题
- Leetcode 67 Add Binary 大数加法+字符串处理
- ACM大数的处理
- VB大数处理程序-----能算任何大的数的次方
- 对大数的精度处理(4)_两大数相加
- java之大数的处理
- POJ 1019 数字长串大数处理
- 大数处理
- 大数处理问题(二)(大数相乘)
- 大数处理--大数相加减问题(c语言)
- 大数加乘处理(利用数组)