厦门大学线下编程比赛第一题:求和

给定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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值