1 3
123
2
6 100
7407407407407407407407407407407407407407407407407407407407407407407407407407407407407407407407407340
3
1 0
0
這道題目一直超時,剛開始用的是java寫的,剛開始以爲是大整數問題,所以就直接利用java.Math裏面的BigInteger類來完成,結果超時了
初始代碼:
import java.util.*;
import java.math.BigInteger;
class Main
{
public static void main(String[] args)
{
int a,n;
Scanner sc = new Scanner(System.in);
char aaa = '0';
System.out.println((int)aaa);
while(sc.hasNextInt())
{
a = sc.nextInt();
n = sc.nextInt();
long t = System.currentTimeMillis();
BigInteger bi = new BigInteger(String.format("%d",a));
BigInteger temp = new BigInteger(String.format("%d",a));
BigInteger biSum = BigInteger.ZERO;
for(int i = 0;i<n;i++)
{
biSum = biSum.add(temp);
temp = temp.multiply(BigInteger.TEN);
temp =temp.add(bi);
}
System.out.println(biSum.toString());
System.out.println(System.currentTimeMillis()-t);
}
}
}
以6 100爲例運行時間是17ms
6 100
74074074074074074074074074074074074074074074074074074074074074074074074074074074
07407407407407407340
17
第二種是:
import java.util.*;
import java.math.BigInteger;
class Main2
{
public static void main(String[] args)
{
int a,n;
Scanner sc = new Scanner(System.in);
//char aaa = '0';
// System.out.println((int)aaa);
while(sc.hasNextInt())
{
a = sc.nextInt();
n = sc.nextInt();
long t = System.currentTimeMillis();
BigInteger bi = new BigInteger(String.format("%d",a));
BigInteger temp = new BigInteger(String.format("%d",a));
BigInteger biSum = BigInteger.ZERO;
for(int i = 0;i<n;i++)
{
biSum = biSum.add(temp);
temp = temp.multiply(BigInteger.TEN);
temp =temp.add(bi);
}
System.out.println(biSum.toString());
System.out.println(System.currentTimeMillis()-t);
}
}
}
第三種方法:採用技巧,把所有數進行累加,好像把所有數手算的時候把所有的數進行相加!
import java.util.Scanner;
class Main3
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int[] sum = new int[100000];
int mod = 0;
int i;
int a = sc.nextInt();
int n = sc.nextInt();
long l = System.currentTimeMillis();
if(n==0)
{
System.out.println(0);
return;
}
for(i =0;i<n||(i>=n&&mod!=0);i++)
{
sum[i] = (a*(n-i)+mod)%10;
mod = (a*(n-i)+mod)/10;
}
for(int j =i-1;j>=0;j--)
{
System.out.print(sum[j]);
}
System.out.printf("\n");
System.out.println(System.currentTimeMillis()-l);
}
}
第三種方法應該是最優的了,可是還是超時,怒用C++
#include<stdio.h>
int main()
{
int sum[100010];
int a,n;
scanf("%d%d",&a,&n);
int i,mod;
if(n==0)
{
printf("0\n");
return 0;
}
for(i =0;i<n||(i>=n&&mod!=0);i++)
{
sum[i] = (a*(n-i)+mod)%10;
mod = (a*(n-i)+mod)/10;
}
for(int j =i-1;j>=0;j--)
{
printf("%d",sum[j]);
}
printf("\n");
return 0;
}
好的,通過了,看來PAT沒有給java雙倍時間啊,無力吐槽
|