文档库 最新最全的文档下载
当前位置:文档库 › 很好的编程练习题目含C++、java版答案

很好的编程练习题目含C++、java版答案

很好的编程练习题目含C++、java版答案
很好的编程练习题目含C++、java版答案

蓝桥杯试题

编译环境:dev c++、NetBeans IDE 7.1.2

1.古堡算式

福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:

ABCDE * ? = EDCBA

他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”

华生:“我猜也是!”

于是,两人沉默了好久,还是没有算出合适的结果来。

请你利用计算机的优势,找到破解的答案。

把ABCDE 所代表的数字写出来。

#include

#define max 100000

using namespace std;

int judge(int n,int m){

int num[5],i,j,p=n;

i=0;

while(p)

{

num[i++]=p%10;//num[0] to num[4] are ABCDE

p/=10;

}//until p=0

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

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

if(num[i]==num[j]) return 0;//get five different number p=n*m;// ABCDE * ?

if(p/max) return 0;//if ABCDE * ?>100000 then not equals EDCBA

i=4;

while(p)

{

if(p%10!=num[i--])return 0;// ABCDE * ?=EDCBA

p/=10;

}

return 1;

}

int main()

{

int i,j;

for(i=10000;i

if(judge(i,j)) cout<

getchar();getchar();

return 0;

}

巧妙之处在如何获取五个互不相同的数字。思路:用五位数的每一位分别代表ABCDE,这样查找范围就是(10000,100000),同样要满足ABCDE*?=EDCBA,ABCDE*?的范围同样是(10000,100000)。而?代表的数字不可能是1,范围是[2,10)。1、定义一个长度为五的数组nums,mums[0]代表E,nums[4]代表A,从(10000,100000)中取一个数字,先把这个五位数的每一位上的值赋给这个数组;2、检验这个数组中的数字是否满足两两互不相同,若满足则继续第三步,若不满足则跳回第一步;3、从[2,10)中取一个数字跟满足条件的五位数相乘,检验ABCDE*?是否超过100000,如果超过则再在[2,10)中找下一个数字检验,如果不超过则继续下一步;4、判断ABCDE*?=EDCBA,如果相等则找到符合条件的等式,若不相等则调回第一步。

Java版

public class ABCDE_to_EDCBA {

public static final int Max=100000;

public static boolean judge(int m,int n)//m代表每位上数字都不相同的五位数,n代表?

{

int []nums = new int[5];

int i = 0;

int p = m;

while(p!=0)

{

nums[i++] = p%10;

p/=10;

}

for(int x = 0 ;x<4;x++)//获得此五位数即ABCDE

for(int y = x+1;y<5;y++)

if(nums[x]==nums[y])

return false;

p = m*n;

if(p/Max!=0)//ABCDE*?不能超过五位数

return false;

//判断ABCDE*?=EDCBA

int k = 4;

while(k!=0)

{

if(nums[k]!=p%10)

return false;

p/=10;

k--;

}

return true;

}

public static void main(String[] args) {

for(int i = 10000;i

{

for(int j = 2 ;j<10;j++)

{

if(judge(i,j))

System.out.println(i+"*"+j+"="+i*j);

}

}

}

}

结果:

21978*4=87912

类似题目:

下列乘法算式中:每个汉字代表1个数字(1~9)。相同的汉字代表相同的数字,不同的汉字代表不同的数字。

赛软件 * 比赛 = 软件比拼

试编程确定使得整个算式成立的数字组合,如有多种情况,请给出所有可能的答案。

【参考结果】

465 * 14 = 6510

2. 巧排扑克牌

小明刚上小学,学会了第一个扑克牌“魔术”,到处给人表演。魔术的内容是这样的:他手里握着一叠扑克牌:A,2,....J,Q,K 一共13张。他先自己精心设计它们的顺序,然后正面朝下拿着,开始表演。

只见他先从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是A;然后再从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是2;......如此循环直到手中只有一张牌,翻开放桌子上,刚好是K。

这时,桌上牌的顺序是:A,2,3,4,5,6,7,8,9,10,J,Q,K

请你计算一下,小明最开始的时候手里牌的顺序是怎样的。

把结果写出来,逗号分割,小明“魔术”开始时,最下面的那张牌输出为第一个数据。

//第四题巧排扑克牌

#include

using namespace std;

int operate(char *seq,char card,int len)

{

if(len==0)

{

seq[0]=card;

return 1;

}

int i;

seq[len]=card;

card=seq[0];

for(i=0;i

seq[i]=seq[i+1];

seq[len]=card;

len++;

seq[len]='/0';

return len;

}

int print(char *s,int len)

{

int i;

for(i=0;i

{

if(s[i]=='T'){cout<<10<<' ';continue;}

cout<

}

cout<

return 0;

}

int main()

{

char seq[15]="KQJT98765432A",result[15];

int i;

for(i=0;i<13;++i)

operate(result,seq[i],i);

print(result,13);

getchar();getchar();

return 0;

}

//倒推法,翻开一张牌的顺序是:先把它前面的那张牌放在队尾然后它在翻开放在队尾,这样如果逆过来就是它先到队尾,再让它前面那张牌到队尾。最后一张肯定是K,第一张是A这样逆转过来的顺序便是从K到A。

Java版:

public class Card_Order {

public static char [] result,order = new char[13];

public static void operator(char c,int len)

{

order[len] = c;

c = order[0];

for(int i=0;i

order[i] = order[i+1];

order[len] = c;

}

public static void main(String[] args) {

result = new char[]{'K','Q','J','T','9','8','7','6','5','4','3','2','A'};

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

operator(result[i],i);

for(int j = 12;j>=0;j--)

{

if(order[j] == 'T')

{

System.out.print("10,");

continue;

}

System.out.print(order[j]+",");

}

}

}

结果:

7,A,Q,2,8,3,J,4,9,5,K,6,10

3. 手机尾号

30年的改革开放,给中国带来了翻天覆地的变化。2011全年中国手机产量约为11.72亿部。手机已经成为百姓的基本日用品!

给手机选个好听又好记的号码可能是许多人的心愿。但号源有限,只能辅以有偿选号的方法了。

这个程序的目的就是:根据给定的手机尾号(4位),按照一定的规则来打分。其规则如下:

1. 如果出现连号,不管升序还是降序,都加5分。例如:5678,4321都满足加分标准。

2. 前三个数字相同,或后三个数字相同,都加3分。例如:4888,6665,7777都满足加分的标准。注意:7777因为满足这条标准两次,所以这条规则给它加了6分。

3. 符合AABB或者ABAB模式的加1分。例如:2255,3939,7777都符合这个模式,所以都被加分。注意:7777因为满足这条标准两次,所以这条标准给它加了2分。

4. 含有:6,8,9中任何一个数字,每出现一次加1分。例如4326,6875,9918都符合加分标准。其中,6875被加2分;9918被加3分。

尾号最终得分就是每条标准的加分总和!

要求程序从标准输入接收数据,在标准输出上输出结果。

输入格式为:第一行是一个整数n(<100),表示下边有多少输入行,接下来是n行4位一组的数据,就是等待计算加分的手机尾号。

输出格式为:n行整数。

例如,输入:

14

3045

0211

2345

6543

7777

8888

7878

7788

6688

2424

2244

9918

6789

8866

则输出:

5

6

8

12

3

3

5

1

1

3

8

5

#include

#include

using namespace std;

int rule1(char *num)

{

int i;

for(i=0;i<3;++i)

if((int)(num[i+1]-num[i])!=1)break;

if(i==3) return 5;

for(i=0;i<3;++i)

if((int)(num[i]-num[i+1])!=1)break;

if(i==3) return 5;

}

int rule2(char *num)

{

int score=0;

int i;

for(i=0;i<2;++i)

if(num[i]!=num[i+1]) break;

if(i==2) score+=3;

for(i=1;i<3;++i)

if(num[i]!=num[i+1]) break;

if(i==3) score+=3;

return score;

}

int rule3(char *num)

{

int score=0;

if(num[0]==num[1]&&num[2]==num[3])score++;

if(num[0]==num[2]&&num[1]==num[3])score++;

return score;

}

int rule4(char *num)

{

int i;

int score=0;

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

if(num[i]=='6'||num[i]=='8'||num[i]=='9')score++;

return score;

}

int main()

{

//ifstream cin("手机号码.txt");

int n,i,score;

char num[6];

loop:

cin>>n;

if(n==0) return 0;

for(i=0;i

{

cin>>num;

//score=0;

cout<

//cout<

}

goto loop;

//getchar();getchar();

//fflush(stdin);

return 0;

}

Java版:

import java.util.*;

public class Phone_Score {

public static int get_score(int x)

{

int score = 0;

int a,b,c,d;

a = x/1000;

b = (x-a*1000)/100;

c = (x-a*1000-b*100)/10;

d = x%10;

if((a+1==b&&b+1==c&&c+1==d)||(a-1==b&&b-1==c&&c-1==d))//1、连号score += 5;

if(a==b&&b==c)

score += 3;

if(b==c&&c==d)

score += 3;

if(a==b&&c==d)

score += 1;

if(a==c&&b==d)

score += 1;

if(a==6||a==8||a==9)

score += 1;

if(b==6||b==8||b==9)

score += 1;

if(c==6||c==8||c==9)

score += 1;

if(d==6||d==8||d==9)

score += 1;

return score;

}

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

System.out.println("请输入电话号码的个数!");

int count = input.nextInt();//获得电话号码的个数

System.out.println("请以此输入电话号码的尾数,以行隔开!");

int []nums = new int[count];

for(int i = 0 ; i

nums[i] = input.nextInt();//获得电话号码System.out.println("手机尾号打分结果如下:");

for(int j = 0 ;j

System.out.println(get_score(nums[j]));

}

}

结果:

请输入电话号码的个数!

14

请以此输入电话号码的尾数,以行隔开!

3045

0211

2345

6543

7777

8888

7878

7788

6688

2424

2244

9918

6789

8866

手机尾号打分结果如下:

5

6

8

12

3

3

5

1

1

3

8

5

类似题目:

信用卡号验证

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

该校验的过程:

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

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

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

例如,卡号是:5432123456788881

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

奇数位和=35

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

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

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

比如,用户输入:356827027232780

程序输出:成功

【程序测试参考用例】

356406010024817 成功

358973017867744 成功

356827027232781 失败

306406010024817 失败

358973017867754 失败

Java版答案:

public boolean test(String s)

{

int len = s.length();

if(len==0)

return false;

char []c = new char[]{'0','1','2','3','4','5','6','7','8','9'};

int [] denumber = new int[]{0,1,2,3,4,5,6,7,8,9};

int count = 0;

int [] number = new int[len];

for(int i = len-1;i>=0;i--)

{

for(int j = 0 ;j<10;j++)

{

if(s.charAt(i)==c[j])

{

if(i-len+1>=0)

number[i-len+1] = denumber[j];//将数组中的值逆转

else

number[len-1-i] = denumber[j];

count++;

break;

}

}

}

if(count!=len)//含有非数字的字符

return false;

int sum1 = 0,sum2 = 0;

for(int k = 0;k

{

if(k%2==0)//奇数位

{

sum1 += number[k];

}

else//偶数位

{

sum2 += 2*number[k]-2*number[k]/10*9;

}

}

if((sum1+sum2)%10!=0)

return false;

return true;

}

private void testActionPerformed(java.awt.event.ActionEvent evt) { boolean b = false;

b = test(cardnumber.getText());

if(b==true)

result.setText("合法");

else

result.setText("不合法");

}

private void cancleActionPerformed(java.awt.event.ActionEvent evt) { cardnumber.setText("");

result.setText("");

}

4. 罗马数字

古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现0的概念!

罗马数字的表示主要依赖以下几个基本符号:

I 1

V 5

X 10

L 50

C 100

D 500

M 1000

这里,我们只介绍一下1000以内的数字的表示法。

单个符号重复多少次,就表示多少倍。最多重复3次。比如:CCC表示300 XX表示20,但150并不用LLL表示,这个规则仅适用于I X C M。

如果相邻级别的大单位在右,小单位在左,表示大单位中扣除小单位。比如:IX表示9 IV表示4 XL表示40 更多的示例参见下表,你找到规律了吗?

I,1

II,2

III,3

IV,4

V,5

VI,6

VII,7

VIII,8

IX,9

X,10

XI,11

XII,12

XIII,13

XIV,14

XV,15

XVI,16

XVII,17

XVIII,18

XIX,19

XX,20

XXI,21

XXII,22

XXIX,29

XXX,30

XXXIV,34

XXXV,35

XXXIX,39

XL,40

L,50

LI,51

LV,55

LX,60

LXV,65

LXXX,80

XC,90

XCIII,93

XCV,95

XCVIII,98

XCIX,99

C,100

CC,200

CCC,300

CD,400

D,500

DC,600

DCC,700

DCCC,800

CM,900

CMXCIX,999

本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。

输入格式是:第一行是整数n,表示接下来有n个罗马数字(n<100)。以后每行一个罗马数字。罗马数字大小不超过999。

要求程序输出n行,就是罗马数字对应的十进制数据。

例如,用户输入:

3

LXXX

XCIII

DCCII

则程序应该输出:

80

93

702

//第九题罗马数字

//#include

#include

#include

using namespace std;

int RomeNum(char r)

{

char Rome[10]="IVXLCDM";

int i;

for(i=0;i<7;++i)

if(r==Rome[i]) return i;

return i;

}

int main()

{

//ifstream cin("Rom.txt");

char Rom[20];

int value[7]={1,5,10,50,100,500,1000},sum,Rno[7];

int n,i,len;

cin>>n;

while(n--)

{

cin>>Rom;

len=strlen(Rom);

sum=0;

for(i=0;i

Rno[i]=RomeNum(Rom[i]);

for(i=0;i

{

sum+=value[Rno[i]];

if(i

{

sum+=value[Rno[i++]];

if(i

sum+=value[Rno[i++]];

}

if(i>0&&Rno[i-1]

sum-=2*value[Rno[i-1]];

}

cout<

}

//getchar();getchar();

return 0;

}

Java版

import java.util.*;

public class Roman_Number {

public static int getDemNumber(String s)

{

int sum = 0;

char[] c = new char[]{'I','V','X','L','C','D','M'};

int len = s.length();

int []rel = new int[]{1,5,10,50,100,500,1000};

int [] temp = new int[len];

for(int i = 0 ;i

{

char tp = s.charAt(i);

for(int j = 0;j

{

if(tp==c[j])

temp[i] = rel[j];

}

}

sum += temp[0];

for(int k = 1;k

{

if(temp[k]<=temp[k-1])

sum += temp[k];

else

sum += temp[k]-2*temp[k-1];

}

return sum;

}

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

int count;

System.out.println("请输入罗马数字的个数!");

count = input.nextInt();

String [] Romnumbers = new String[count];

System.out.println("请输入罗马数字,每行一个!");

for(int i = 0 ;i

{

Romnumbers[i] = input.next();

}

input.close();

System.out.println("这些罗马数字对应的十进制数值如下:");

for(int j = 0 ;j

{

//依次获取罗马数字的十进制数值并输出

System.out.println(getDemNumber(Romnumbers[j]));

}

}

}

结果:

请输入罗马数字的个数!

4

请输入罗马数字,每行一个!

CMXCIX

LXXX

XCIII

DCCII

这些罗马数字对应的十进制数值如下:

999

80

93

702

做几点说明:这些题目以及其中的C++程序是本人在网上下载的,看了一下题目然后由本人补充了java语言的程序,仅供参考!

相关文档