2011软件设计大赛题

本文介绍了一种信用卡号码的校验算法——Luhn算法,并提供了实现该算法的示例代码。通过对输入的信用卡号码进行特定的数学计算,可以验证其有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

 

1.      代码填空(满分3分)

以下程序打印出0~9的数字,请补充缺少的代码。

public class MyTest

{

    public static void f(int begin, int end)

    {

                               ______ if(begin>end) return; 

____________;

        System.out.println(begin);

        f(begin+1, end);   

    }

    public static void main(String[] args)

    {

        f(0,9);

    }

}

这个其实问的是递归函数的出口问题,每个递归函数都要有一个出口,这道题的出口就是判断begin是否比end大。

2.      代码填空(满分4分)

如果要把两个整型变量ab的值交换,一般要采用一个中间变量做过渡,但也可以在不借助任何其它变量的情况下完成。试填写缺失的代码。

    a = a ^ b;

    b = _________;

    a = _________;

a=a^b;
b=b^a;
a=a^b;

 

3.      代码填空(满分3分)

 

许多人都曾经玩过“拍七”游戏。规则是:大家依次从1开始顺序数数,数到含有77的倍数的要拍手或其它规定的方式表示越过(比如:7,14,17等都不能数出),下一人继续数下面的数字。违反规则者受罚。下面的程序模拟这个过程,拍7的情况输出“*”,请完善之。

    for(int i=1; i<100; i++)

    {

        if(i % 7 == 0)

            printf("*\n");

        else if(___________________)

            printf("*\n"); 

        else

            printf("%d\n", i);

    }

 

else if(i/10==7 || i%10==7)//判断十位和个位上有没有包含7

4.      代码填空(满分5分)

下面的静态方法的目的是求出某个日期是该年度的第几天。试完善之。

如果传入:year=1980month=1, day=1

则返回 1

如果传入:year=1980month=2, day=1

则返回 32

public static int getDayOfYear(int year, int month, int day)

{

        int [][]days=_____________________;

        int flag =(year%4==0 && year%100!=0) || year%400 == 0 ? 1 : 0;

        int sum = day ;

        for(int i=0;i<month;i++)    {

            sum += days[flag][i];

        }      

        return sum;    

}

public class MyDate {
 public static int getDayOfYear(int year, int month, int day)
 {
   int [][]days=new int[][]{{0,31,29,31,30,31,30,31,31,30,31,30,31},{0,31,28,31,30,31,30,31,31,30,31,30,31}};
   int flag =(year%4==0 && year%100!=0) || year%400 == 0 ? 1 : 0;
   int sum = day ;
   for(int i=0;i<month;i++) {
    sum += days[flag][i];
   }  
   return sum;  
 }
 public static void main(String[] args) {
  int l = getDayOfYear(1991, 2, 1);
  System.out.println(l);
 }
}

 

5.      代码填空(满分2分)

下列方法的目的是,找出1~n之间所有的平方数。试补全缺失的代码。

n=10时,输出结果是:

1 4 9

n=100时,输出结果是:

1 4 9 16 25 36 49 64 81

 

    public static void showSqure(int n)

    {

        for(int i=0; i<n; i++)

        {

            for(int j=1; j<=i; j++)

            {

                if(i==_j*j____________) System.out.print(i + " ");

            }

        }

       

        System.out.println();

    }

6.      代码填空(满分9分)

(a+b)n次幂的展开式中各项的系数很有规律,对于n=234时分别是:1 2 1 1 3 3 11 4 6 4 1。这些系数构成了著名的杨辉三角形:

                 1

               1   1

              1  2  1

            1  3   3   1

          1  4   6   4   1

        1  5  10  10   5   1

 

下列的程序给出了计算第m层的第n个系数的计算方法,试完善之(mn都从0算起)。

    public static int f(int m, int n)

    {

        if(m==0) return 1;

        if(n==0 || n==m) return 1;

                               return ___f(m-1,n-1)+f(m-1,n)

_______________________;

    }

 

7.      代码填空(满分4分)

 

下面的代码将数组中的元素的位置颠倒过来:

比如:原来的元素是 [1,2,3]

则颠倒后变为:[3,2,1]

public static void reverse(int[] arrs)

{

       

for (int i = 0, j = arrs.length - 1; i <_________ ; i++, j--)

{

        int temp = arrs[i];

        arrs[i] = arrs[j];

        arrs[j] = temp;

    }

}

 

8.      程序设计(满分15分)

从键盘输入一个整数(1~20

则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。例如:

输入数字2,则程序输出:

1 2

4 3

输入数字3,则程序输出:

1 2 3

8 9 4

7 6 5

输入数字4 则程序输出:

1  2   3   4

12  13  14  5

11  16  15  6

10   9  8   7

import java.util.Scanner;
 
public class T {
 private int maxNum;
 
 public T(int maxNum) {
  this.maxNum = maxNum;
 }
 
 public void print() {
  for (int i = 1; i <= maxNum; i++) {
   for (int j = 1; j <= i; j++) {
    System.out.print(j);
    System.out.print("*");
    System.out.print(i);
    System.out.print("=");
    System.out.print(i * j);
    System.out.print("\t");
   }
   System.out.println();
  }
 }
 
 public static void main(String[] args) {
  System.out.print("录入一个整数:");
  Scanner input = new Scanner(System.in);
  // 没有考虑判断输入的是否是整数。
  int maxNum = input.nextInt();
  new T(maxNum).print();
 }
}

 

9.      程序设计(满分9分)

从键盘输入一个日期,格式为yyyy-M-d

要求计算该日期与1949101日距离多少天

例如:

用户输入了:1949-10-2

程序输出:1

用户输入了:1949-11-1

程序输出:31

SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
         Date d= new Date();
         Date a = sf.parse("1949-10-11");
         long x = d.getTime()-a.getTime();
         System.out.println(x/1000/(24*60*60));

 

import java.util.Date;
import java.text.*;
import java.util.*;
public class time {

     /**
      * @param args
      */
     public static void main(String[] args) {
         // TODO Auto-generated method stub
         SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
         Date d= new Date();
         Date a= new Date();
         Date a = sf.parse("1949-10-11");
         Scanner input = new Scanner(System.in);
         long x = d.getTime()-a.getTime();
         System.out.println(x/1000/(24*60*60));

     }
    
}
是调不通的。求解。。。

 

 

17

引用 杨婷的问问 (16)

如果是计算某一天距离1948-10-1日有多少天的话 也很简单 下面的代码: import java.util.Date; import java.text.*; import java.util.*; public class Date1{            public static void main(String[] args) {    &n...

非常感谢、这个我们都没有学到呢、谢谢!!

 

 

 

#include <stdio.h>

struct date {
        
int
year;
        
int
month;
        
int
day;
};

int main (void
) {

        
int getDaysOfDate (struct
date d);
        
struct
date firstDate,secondDate;
        
int
firstDays,secondDays;

        printf (
"Enter first date [yyyy mm dd]:"
);
        scanf (
"%i %i %i"
,&firstDate.year,&firstDate.month,&firstDate.day);

        printf (
"Enter second date [yyyy mm dd]:"
);
        scanf (
"%i %i %i"
,&secondDate.year,&secondDate.month,&secondDate.day);

        firstDays=getDaysOfDate(firstDate);
        secondDays=getDaysOfDate(secondDate);


        printf (
"Two date between the number days is: %i\n"
,secondDays-firstDays
);

        
return 0
;

}

int getDaysOfDate (struct
date d) {

        
int
days;

        
if(d.month<=2
) {
                days=
1461*(d.year-1)/4+153*(d.month+13)/5
+d.day;
        }
else
{
                days=
1461*d.year/4+153*(d.month+1)/5
+d.day;
        }

        
if(d.year>=1700&&d.month>=3&&d.day>=1 && d.year<=1800&&d.month<=2
&&d.day
<=
28
) {
                days=days+
2
;
        }
        
if(d.year>=1800&&d.month>=3&&d.day>=1 && d.year<=1900&&d.month<=2
&&d.day
<=
28
) {
                days=days+
1
;
        }

        
return
days;

}



public static int getDays(GregorianCalendar g1, GregorianCalendar g2) {
  int elapsed = 0;
  GregorianCalendar gc1, gc2;
  if (g2.after(g1)) {
   gc2 = (GregorianCalendar) g2.clone();
   gc1 = (GregorianCalendar) g1.clone();
  } else {
   gc2 = (GregorianCalendar) g1.clone();
   gc1 = (GregorianCalendar) g2.clone();
  }
  gc1.clear(Calendar.MILLISECOND);
  gc1.clear(Calendar.SECOND);
  gc1.clear(Calendar.MINUTE);
  gc1.clear(Calendar.HOUR_OF_DAY);
  gc2.clear(Calendar.MILLISECOND);
  gc2.clear(Calendar.SECOND);
  gc2.clear(Calendar.MINUTE);
  gc2.clear(Calendar.HOUR_OF_DAY);
  while (gc1.before(gc2)) {
   gc1.add(Calendar.DATE, 1);
   elapsed++;
  }
  return elapsed;
 }
public void main(String[] args) {
Calendar cal = Calendar.getInstance();
GregorianCalendar gc1 = new GregorianCalendar(2009, Calendar.JANUARY, 1);
GregorianCalendar gc2 = new GregorianCalendar(cal.get(Calendar.YEAR),cal.get(Calendar.MONTH), cal.get(Calendar.DATE));
int days= getDays(gc1, gc2);
System.out.println(days);

}

10. 程序设计(满分20分)

任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。

比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。

 

请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:

[82962, 75933, 63954, 61974]

其中数字的先后顺序可以不考虑。

#include <stdio.h>
 #include <string.h>
 #include<iostream.h>
//构造位运算结构。
//目的是减少内存占用。
//由于数据是五位数,所以按照位操作100000/8=12500,所以对应于12500即可。
 char bit[12501];//用于记录数据,用bit来进行记录,1代表之前测试过这个数,但不一定输出过。
 char bitPrintf[12501];//1代表以及输出。
 char bitCurr[12501];//代表本次扩展访问的数的标注。
 //设置bitCurr中的对应的位。
  void setcbit(long t)//纪录t
{
     bitCurr[t>>3]|=(0x01<<(t&0x07));
 }
 
 //取得bitCurr标记中的对应t的那位状态
 int getcbit(long t)
 {
    int arrindex=t>>3;
    int ch=0x01<<(t&0x07);
    if(bitCurr[arrindex]&(ch))//这是取得t/8对应的char的第t%8位数据
        return 1;
   else
       return 0;
 }
 
 //设置bitPrint中的对应的位
 void setbit(long t)
 {
    bit[t>>3]|=(0x01<<(t&0x07));
}
 
 //取得标记中的对应t的那位状态
 int getbit(long t)
 {
    int arrindex=t>>3;
    int ch=0x01<<(t&0x07);
    if(bit[arrindex]&(ch))//这是取得t/8对应的char 的第t%8位数据
        return 1;
    else
       return 0;
 }
 
  void setpbit(long t)//纪录t
 {
     bitPrintf[t>>3]|=(0x01<<(t&0x07));
 }
 
 //取得标记中的对应t的那位状态
 int getpbit(long t)
 {
   int arrindex=t>>3;
   int ch=0x01<<(t&0x07);
    if(bitPrintf[arrindex]&(ch))//这是取得t/8对应的char 的第t%8位数据
        return 1;
    else
         return 0;
 }
 
//函数对num所能排列成的任何数据进行标记
//如若已经出现过,则返回0,否则返回1
 int setFlag(long num)
 {
     return 1;
}
//排序,对分离的五位数字进行排序
 void sort(int *b)
{
   int t;
   for(int i=0;i<5;i++)
  {
       for(int j=i+1;j<5;j++)
      {
          if(b[i]<b[j])
         {
              t=b[i];
               b[i]=b[j];
               b[j]=t;
          }
     }
   }
 }
 
 //根据当前的数据t,得到下一个数据
 long getNextNumber(long t)
 {
   int b[5];
   for(int i=0;i<5;i++)
   {
      b[i]=t%10;
      t/=10;
   }
   sort(b);
   long maxNum=b[0]*10000+b[1]*1000+b[2]*100+b[3]*10+b[4];
   long minNum=b[4]*10000+b[3]*1000+b[2]*100+b[1]*10+b[0];
   return maxNum-minNum;
 }
 
 //通过给定的一个数,可以搜索所有可以生成的数,并判断是否进入了五位圈
 void findCyle(long t)
{
   memset(bitCurr,0,sizeof(bitCurr));
  while(getbit(t)==0)//找到下一个数
   {
        setbit(t);
        setcbit(t);
        t=getNextNumber(t);
     }
    if(getcbit(t)==1 && getpbit(t)==0)//这次访问,还没输出过,进入循环判断输出阶段
   {
        setpbit(t);
        cout<<t<<endl;
     while(1)//找到下一个数
       {
           t=getNextNumber(t);
           if(getpbit(t)==0)
           {
                setpbit(t);
               cout<<","<<t;
        }
          else
            {
              cout<<"]";
                break;
         }
      }
   }
 }
 
 
int main()
{
 int i;
   memset(bit,0,sizeof(bit));//清空数据
  //考虑到时间复杂度,对特殊数据进行了特殊处理
   setpbit(11111);
   setpbit(22222);
   setpbit(33333);
   setpbit(44444);
   setpbit(55555);
   setpbit(66666);
   setpbit(77777);
   setpbit(88888);
   setpbit(99999);
   setbit(11111);
   setbit(22222);
   setbit(33333);
   setbit(44444);
   setbit(55555);
   setbit(66666);
   setbit(77777);
   setbit(88888);
   setbit(99999);
    cout<<endl;;
    
   cout<<"please input the number:"<<endl;
   cin>>i;
       if(getbit(i)==0)//表明这个数还没进入任何一个圈,要进行判断
      {
           findCyle(i);
       }
 
  return 1;

}

 

import java.util.ArrayList;

import java.util.List;

 

public class CycleTest {

 

 

 

 public static int computer(String str,List list){

 

 

  int min = 0;

  int max = 0;

  int substraction = 0;

  String s1 = "";

  String s2 = "";

  String s3 = "";

 

 

  int[] a = new int[str.length()];

  int[] b = new int[str.length()];

 

  for(int i = 0 ;i < str.length(); i++){

  

   int x = Integer.parseInt(str.charAt(i)+"");

     

   a[i] = x;

   b[i] = x;

  }

  for(int i = 0 ;i < a.length; i++){

  

   for(int j = a.length - 1 ;j > i;j--){

   

    if(a[j] < a[j - 1]){

    

     int temp = a[j];

     a[j] = a[j - 1];

     a[j - 1] = temp;

    }

   }

  

  }

 for(int i = 0 ;i < b.length; i++){

  

   for(int j = b.length - 1 ;j > i;j--){

   

    if(b[j] > b[j - 1]){

    

     int temp = b[j];

     b[j] = b[j - 1];

     b[j - 1] = temp;

    }

   }

  

  }

  for(int i = 0;i < a.length;i++){

  

   s2 += a[i]+"";

  

  }

  //Get the minimum

  min = Integer.parseInt(s2);

//  System.out.println(min);

 

  for(int i = 0;i < b.length;i++){

  

   s3 += b[i];

  

  }

  //Get the maximum

  max = Integer.parseInt(s3);

//  System.out.println(max);

  substraction = max - min;

  list.add(substraction);

  for(int i = 0;i < list.size()-1; i++){

   if((Integer)list.get(i) == substraction){

//    System.out.println(list);

    return 0;

   

   }

  }

  s1 = (max - min)+"";

//  System.out.println(list);

  return  computer(s1,list);

 

 

 }

 

 

 

 public static void main(String[] args) {

 

 

  String  s1 = "57238";

  List list = new ArrayList();

  computer(s1,list);

  list.remove(list.size()-1);

 

  System.out.println(list);

 

 

 

 

 }

 

}

试试吧,我也是刚做的!

回答者: 哭淳 | 一级 | 2011-4-27 12:44

import java.util.Arrays;

public class MyTest10 {

      public static void main(String args[])

      {

     

           int f=Sort(array(34256));

        int x=Sort(array(34256));

        for(int i=0;i<4;i++)

           {     

         x=Sort(array(x));

         System.out.print(x+" ");

         }

        }

     

      static int []array(int n)

      {

     int a[]=new int[5];

     int i=0;

     int m=n;

     while(i<5)

     {

      a[i]=m%10;

      if(m%10==0)

       a[i]=0;

      m/=10;

      i++;

     }

     return a;

      }

      static int Sort(int a[]){

       Arrays.sort(a);

       String min="";

       for(int i=0;i<5;i++)

       {

       min=min+String.valueOf(a[i]);

       }

       int Min=Integer.parseInt(min);

       StringBuffer sb=new StringBuffer(min).reverse();

       String max=new StringBuffer(sb).toString();

       int Max=Integer.parseInt(max);

       int c=Max-Min;

       return c;

       }

 }

 

11. 程序设计(满分 9 分)

当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。

该校验的过程:

1、从卡号最后一位数字开始,逆向将奇数位(135等等)相加。

2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。

3、将奇数位总和加上偶数位总和,结果应该可以被10整除。

例如,卡号是:5432123456788881

则奇数、偶数位(用红色标出)分布:5432123456788881

奇数位和=35

偶数位乘以2(有些要减去9)的结果:1 6 2 6 1 5 7 7,求和=35

最后35+35=70 可以被10整除,认定校验通过。

 

请编写一个程序,从键盘输入卡号,然后判断是否校验通过。通过显示:“成功”,否则显示“失败”。

比如,用户输入:356827027232780

程序输出:成功

题目:当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。
该校验的过程:
1
、从卡号最后一位数字开始,逆向将奇数位(135等等)相加。
2
、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
3
、将奇数位总和加上偶数位总和,结果应该可以被10整除。
例如,卡号是:5432123456788881
则奇数、偶数位(用红色标出)分布:
5432123456788881
奇数位和
=35
偶数位乘以2(有些要减去9)的结果:1 6 2 6 1 5 7 7,求和=35

最后35+35=70 可以被10整除,认定校验通过。

请编写一个程序,从键盘输入卡号,然后判断是否校验通过。通过显示:成功,否则显示失败
比如,用户输入:356827027232780
程序输出:成功

我的代码:import java.util.*;
public class paishou {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
String num ;
System.out.print("
请输入卡号
");
num=input.next();
int sum= 0;
int sum1=0;

for (int i=num.length()-1;i>=0;i-=2)
{
int flag = num.charAt(i);
sum= sum + flag;

}
for (int i =num.length()-1;i>=1;i-=2)
{
int flag = num.charAt(i);
if (flag*2>=10)
flag=flag*2-9;

sum1 = sum1 + flag;

}
if ((sum+sum1)/10==0)
System.out.print("
成功
");
else 
System.out.print("
失败
");

}

}
为什么运行的结果是错的呢、

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值