给定a和n,计算a+aa+aaa+aaaa+...+a...a(n个a) 的和。
输入描述:
测试数据有多组,以文件结尾。每行输入a,n(1<=a,n<=1000000)。
输出描述:
由于结果可能比较大,所以请输出答案mod 1000000007。
在网上看到相关解法,加以精简单和解释,发给大家看看。文章最后附文章链接。
package t151016;
import java.util.Scanner;
public class SumOfNA {
static int[] num;
private static Scanner cin;
static long b = 1000000007;
public static void main(String[] args) {
cin = new Scanner(System.in);
while (cin.hasNext()) {
int a = cin.nextInt();
int n = cin.nextInt();
int aa = a;
int l = 0;
while (aa != 0) {
l++; // 得到a的位数
aa = aa / 10;
}
int wei = n * l; // 得到最长单元位数
num = new int[wei + 2];
for (int i = 0; i < wei + 2; i++) {
num[i] = 0;
}
for (int i = 0; i < n; i++) { // 把数据写入数组
dataToArray(a, i, l);
}
for (int i = 1; i < wei + 2; i++) { // 如果num[i]>9则向高位地址进位
if (num[i] > 9) {
num[i + 1] += (num[i] / 10);
num[i] = num[i] % 10;
}
}
long res = getResult(wei);
System.out.println(res);
}
}
/**
* 输出最终结果
*
* @param wei
* @return
*/
private static long getResult(int wei) {
long res = 0l;
for (int i = wei + 1; i > 0; i--) {
res = res * 10 + num[i];
if (res >= b) { // 从高位开始取模
res %= b;
}
}
return res;
}
/**
* 把a放到num[1]~num[l]中,把a...a(k个a)放到num[1]~num[k*l]中
* 例如:a=23,则a=23,此时data(a,1-1,2) a[1]=3;a[2]=2;
*
* 例如:a=23,则aa=2323,此时data(a,2-1,2); a[1]=3;a[2]=2;a[3]=3;a[4]=2;
*
* 例如:a=23,则aaa=232323,此时data(a,3-1,2);
* a[1]=3;a[2]=2;a[3]=3;a[4]=2;a[5]=3;a[6]=2;
*
* 三次data()后, a[1]=9;a[2]=6;a[3]=6;a[4]=4;a[5]=3;a[6]=2
*
* @param a
* @param i
* @param l
*/
private static void dataToArray(int a, int i, int l) {
for (int k = 0; k <= i; k++) { // k个a
int aa = a;
for (int j = 0; j < l; j++) {
num[j + (k * l) + 1] += aa % 10;
aa /= 10;
}
}
}
}
问题原答案链接:http://bbs.csdn.net/topics/390957208