如何制作一个程序来打印系列:1,12,123 ... 12345678910,1234567891011 ...以此类推?

时间:2018-08-26 07:15:26

标签: java

//I tried this one but output was wrong for tenth term
 import java.io.*;
 public class series
 {
     public static void main(String args[])throws IOException
     {
         BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
         int n,i,i1=0,s=0,c=0;
         System.out.println("Enter the term of the series you want to get");
         n=Integer.parseInt(in.readLine());
         for (i=1;i<=n;i++)
         {
             i1=i;
             while (i1!=0)
             {
                 c+=1;
                 i1=i1/10;
             }
             s=(int)(s*(Math.pow(10,c))+i);
             c=0;
             System.out.print(s+" ");
         }
     }
 }

3 个答案:

答案 0 :(得分:5)

我不知道您为什么使用当前的方法。我将跟踪上一期的印刷内容。

StringBuilder term = new StringBuilder("");
final int N = 20;

for (int i=1; i <= N; ++i) {
    term.append(i);
    if (i > 1) System.out.print(",");
    System.out.print(term.toString());
}

Demo

编辑:我建议使用字符串显示每个术语的原因是,您的要求似乎主要是表示之一。也就是说,您实际上并没有对每个术语进行任何数学运算,所以为什么不完全避免数字类型,也避免了诸如溢出和精度损失之类的问题。

答案 1 :(得分:1)

虽然Tim's answer很整洁,但我认为练习非常基本,以至于StringBuilder超出了范围(*)。

相反,您可以使用嵌套的for循环:

final int N = 20;

for (int i=1; i <= N; ++i) {
    if (i > 1) System.out.print(",");
    for (int a = 1; a <= i; ++a) {
        System.out.print(a);
    }
}

(这还将提高内存效率,因为不需要随着StringBuffer的增加而不断重新分配i的内部缓冲区。但这实际上是次要的(甚至更少) )关注)。

(*)是的,您可以不使用StringBuilder而执行相同的操作,只需使用String连接即可;但这对于初学者可能无法“理解”的方式将是低效的,因此最好将其引导。嵌套循环比以任何形式的字符串串联更有用,它可以帮助您解决问题。

答案 2 :(得分:0)

第十个学期后输出错误的主要原因是整数溢出。您可以花很长时间摆脱它,但可以使用某些术语,但绝对更好的解决方案是使用Strings

回答。