这里要说明一下,这道题的题目和测试数据不相符,于是——我把题目改了一下:
[问题描述]
Farmer John的奶牛喜欢看书,并且Farmer John发现他的奶牛看了一些关于自然科学的书,产出了更多牛奶。他决定把原本廉价的小说换成关于自然科学的书。不幸的是,有些书掉进了泥浆里,它们的ISBN码看不清了。
ISBN码(国际标准图书编号)是十个阿拉伯数字组成的编码,用来唯一的标识一本书。如果要验证ISBN码是否正确,你要把第一个数字乘10,第二个数字乘9,第三个数字乘8,第四个数字乘7……直到最后一个数乘1,再把这些积累加起来,如果得数能被11整除(也就是11的倍数)的话,那么这就是一个合法的ISBN码。
比如说0201103311是一个合法的ISBN码,因为:
0×10 + 2×9 + 0×8 + 1×7 + 1×6 + 0×5 + 3×4 + 3×3 + 1×2 + 1×1
前九个数都在0 – 9之间。有时候,最后一个数字有要取10,那么我们就把最后一个数字写成大写X(这个时候就不叫数字了,呵呵),比如156881111X也是一个合法的ISBN码。你的任务就是在给你丢失了一个数字的ISBN码之后,确定那个丢失的数字。丢失的数字用“ ?”表示。
[输入格式]
一个10个数字组成的ISBN码,其中包含用“ ?”表示的丢失的数字。
[输出格式]
丢失的ISBN码(0-9或大写X)。如果标有“ ?”的地方没有数字可以使之成为合法的ISBN码,则输出-1。
[输入样例]
02011?3311
[输出样例]
0
好的,然后上代码:
#include#include #include using namespace std; int i,k,n,t,s=0; string a; bool f=1; int main() { freopen ("isbn.in","r",stdin); freopen ("isbn.out","w",stdout); cin >>a; for (i=0;i<10;i++) { if (a[i]=='?') k=10-i; else if (a[i]>='0' && a[i]<='9') { s+=(a[i]-48)*(10-i); } else s+=10; } t=(s/11+1)*11-s; if (s!=0) { if (s%11==0) cout <<0; else if (k!=1) { for (i=0;(t+i*11)/k<10;i++) if ((t+i*11)%k==0) { cout <<(t+i*11)/k; f=0; break; } if (f) cout <<-1; } else { if (t<10) cout < 好了,代码很好懂,别忘点个赞。



