您的位置:首页 > 其它

“大数处理“

2015-03-17 17:53 239 查看
题目描述:输入数字a,n,计算[a+aa+..+aaaaaa..aaa(n个a)]mod1000000007;

想法:主要利用了模运算的有关规律使得每一个数字计算时都不会溢出。同时将每个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中的元素。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: