POJ 2498 StuPId(我的水题之路——from back to front- -!)

StuPId
Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 5830 Accepted: 3019

Description

Background 
At DUT, the Dreamland University of Technology, all students have personal id, numbers with six or seven digits. But they're not just any numbers. Only those that have a checksum with a zero as last digit can be valid ids. 
Problem 
Here's how to compute the checksum of an id number. Multiply the digits from back to front (!) with repeating factors 9, 3, 7. Then simply add the products. Example: 
id number :  1  3  9  0  2  7  2

factors   :  9  7  3  9  7  3  9

products  :  9 21 27  0 14 21 18

Here the checksum is 9+21+27+0+14+21+18 = 110. The last digit is zero, so the id is valid. Sometimes students have very bad handwriting and the teaching assistents have a hard time identifying the id’s. You're asked to help in special cases, where exactly one digit is unreadable. In that case, the missing digit can be computed (there's always exactly one correct digit, thanks to 9, 3 and 7 being relatively prime to 10). Note that the students always begin concentrated and thus the first digit will always be readable (and not zero).

Input

The first line contains the number of scenarios. Each scenario is a single line that contains an id number with one digit replaced by a question mark and with six or seven digits length.

Output

The output for every scenario begins with a line containing "Scenario #i:", where i is the number of the scenario starting at 1. Then print a single line containing the correct id number. Terminate the output for the scenario with a blank line.

Sample Input

4
13?0272
3?5678
345?78
314?592

Sample Output

Scenario #1:
1390272

Scenario #2:
335678

Scenario #3:
345778

Scenario #4:
3146592

Hint

Huge input and output,scanf and printf are recommended.

Source


好吧,又是英文题,太恶心了!!一开始没有看懂,之后纠结了好久才发现是从后往前乘。

就是说有一个六或七位的数字,对于它从后向前每一位,一一对应的乘上{9,3,7}如例子(注意是从后向前),之后将各个乘积相加,保证最后之和可以被10整除,即是正确。现在给你这个数字,但是其中一个字母已经磨损了看不清,但它不会是第一个数字,现在请补全整个数字并且输出。

读懂题目之后,先想到的就是用字符数组存储,然后通过模拟,运算出已知数和 {9,3,7}的乘积之和,并且同时保存下缺少数字的位置和本应该乘以的数字,然后枚举0到9,看是否有符合要求的值,之后保存到原字符数组中,并输出。

代码(1AC):
#include <cstdio>
#include <cstdlib>
#include <cstring>

char num[10];
int mul[3] = {9, 3, 7};

int main(void){
    int ii, casenum;
    int sum, pos, need;
    int len, value;
    int i, j;

    scanf("%d", &casenum);
    for (ii = 1; ii <= casenum; ii++){
        scanf("%s", num);
        len = strlen(num);
        sum = 0;
        for (i = len - 1, j = 0; i >= 0; i --, j++){
            if (num[i] != '?'){
                sum += mul[j % 3] * (num[i] - '0');
            }
            else{
                pos = i;
                need = mul[j % 3];
            }
        }
        for (value = 0, i = 0; i <= 9; i++){
            if ((i * need + sum) % 10 == 0){
                value = i;
                break;
            }
        }
        num[pos] = value + '0';
        printf("Scenario #%d:\n%s\n\n", ii, num);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值