第1关:相同数字不同位数之和
任务描述
本关任务:编写一个能计算相同数字不同位数之和 的小程序。
编程要求
求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字,最后一项的位数为n。
例如用户输入a=1,n=3时表示要求1+11+111。
效果如下: 输入:1 2
输出:12
#include <iostream>
using namespace std;
int main()
{
/********** Begin ********/
int a,n,sum=0;
cin >> a >>n;
int b=a;
if(n>1){for(int z=1;z<=n;z++){
int x=b;
sum+=a;
for(int i=1;i<=z;i++)x*=10;
a+=x;
}
}
if(n==1)sum =a;
cout << sum;
/********** End **********/
}
第2关:求平均值
任务描述
本关任务:编写一个能计算n个整数的平均值的小程序。
编程要求
从键盘输入n个整数,编写程序计算其中所有整数的平均值。 输入包括2行: 第一行包含一个整数,表示输入的整数个数n, 第二行包含n个整数,用空格分隔。
效果如下: 输入: 6
-1 3 6 0 -5 4
输出: 1.16667
#include <iostream>
using namespace std;
int main()
{
/********** Begin ********/
int n=0;
double sum=0;
int a[1000];
cin >> n;
for(int z=0;z<n;z++){
cin >> a[z];
sum +=a[z];
}
cout << sum/n;
return 0;
/********** End **********/
}
第3关:生成ISBN13编码
任务描述
本关任务:编写一个能生成ISBN13编码的小程序。
相关知识
SBN13号在2007年正式启用每本书的ISBN13号由五个部分构成:
- 978(或979);
- 出版国家或语言代码;
- 出版社代码;
- 书代码;
- 校验码。
例如:《C++程序设计(第2版)》的ISBN13号是978-7-302-21897-5,其中5为校验码。
算法
示范数据:7-5080-2710-8
- 去掉末尾校验码8,前面统一加上978(中国),为:978750802710
- 从代码位置序号2开始,所有偶数位的数字代码求和为a, 7 + 7 + 0 + 0 + 7 + 0 = 21
- 将a乘以3为a, 21 * 3 = 63
- 从代码位置序号1开始,所有奇数位的数字代码求和为b,9 + 8 + 5 + 8 + 2 + 1 = 33
- 将a和b相加为c, 63 + 33 = 96
- 取c的个位数d(如果最后算出的个位数d为0的话,则校验值数值为0)。 个位:6
- 用10减去d即为校验位数值,将它置于最后一位。10 - 6 = 4
- 条形码为:9 7 8 7 5 0 8 0 2 7 1 0 4
编程要求
根据输入的ISBN13前四部分和校验算法,生成完整的ISBN13代码并输出。
注意:因为是机器自动判题,我们约定输入的前四部分的每位数字之间用空格隔开。
例如输入9 7 8 7 3 0 2 2 1 8 9 7,输出9787302218975。
效果如下: 输入:9 7 8 7 3 0 2 2 1 8 9 7
输出:9787302218975
#include <iostream>
using namespace std;
int main()
{
int x[12];
int a,b,c,d;
for(int i=0;i<12;i++){cin >>x[i];}
a = x[1]+x[3]+x[5]+x[7]+x[9]+x[11];
a*=3;
b = x[0]+x[2]+x[4]+x[6]+x[8]+x[10];
c =a+b;
d =c%10;
if(d!=0)d = 10-d;
else d=0;
for(int z=0;z<12;z++)cout <<x[z];
cout << d;
/********** End **********/
}
第4关:ISBN13和ISBN10的转换
任务描述
本关任务:编写一个能转换ISBN13和ISBN10的小程序。
相关知识
2007年之前国际标准书号使用ISBN10编码,ISBN10编码由4部分构成:出版国家或语言代码、出版社代码、书代码、校验码。而且,ISBN10的校验算法与ISBN13不同。
算法
10位ISBN的校验码计算公式:
- ISBN最右1位为校验位,由前9位通过公式计算得出,同时可以检验ISBN号的正确与否,下面给出一个简单易记的校验码计算公式,从左至右的前9位,每1位数与10至2的9个数加权求和,然后计算和与11的余数,最后求11与余数的差,差即为校验码; 例:
ISBN: 7802253217
11-((7*10+8*9+0*8+2*7+2*6+5*5+3*4+2*3+1*2)%11)=7
如差为10
,则校验码为X
; 如差为11
,则校验码为0
。
13位ISBN的校验码计算公式:
- ISBN最右1位为校验位,由前12位通过公式计算得出,同时可以检验ISBN号的正确与否,下面给出一个简单易记的校验码计算公式,从左至右的前12位,每1位数依次与1和3这2个数加权求和,然后计算和与10的余数,最后求10与余数的差,差即为校验码; 例:
ISBN: 9787802253216
10-((9*1+7*3+8*1+7*3+8*1+0*3+2*1+2*3+5*1+3*3+2*1+1*3)%10)=6
如差为10
,则校验码为0
。
编程要求
要求:在上一关练习题基础上,输入一个ISBN13码,首先通过校验算法判断其是否合法,是则输出对应的ISBN10编码(中间没有空格),否则输出“Error”。
详细情况和校验算法见附加的维基百科的说明文档。 注意:因为是机器自动判题,我们约定输入的前四部分的每位数字之间用空格隔开。
效果如下:
输入:9 7 8 7 3 0 2 2 1 8 9 7 5
输出:7302218974
#include <iostream>
using namespace std;
int main()
{
/********** Begin ********/
int a,b,c,d,e,f,g,h,i,j,k,l,m,S,N,M;
cin>>a>>b>>c>>d>>e>>f>>g>>h>>i>>j>>k>>l>>m;
int num = 10-(a*1+b*3+c*1+d*3+e*1+f*3+g*1+h*3+i*1+j*3+k*1+l*3)%10;
if(num == m)
{
int x = 11-(10*d+9*e+8*f+7*g+6*h+5*i+4*j+3*k+2*l)%11;
if(x == 10)
cout<<d<<e<<f<<g<<h<<i<<j<<k<<l<<'x';
else if(x == 11)
cout<<d<<e<<f<<g<<h<<i<<j<<k<<l<<0;
else
cout<<d<<e<<f<<g<<h<<i<<j<<k<<l<<x;
}
else
{
cout<<"Error";
}
return 0;
/********** End **********/
}