鱼C论坛

 找回密码
 立即注册
查看: 1319|回复: 3

[已解决]djasdhkjash

[复制链接]
发表于 2023-11-20 11:06:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这个怎么用C语言写呀
有一个字符串均由数字组成,我们规定该字符串的校验和的计算方法为,首先把每一位上的数字都乘以一个权值,然后把所得到的这些乘积再加起来,得到一个和,最后用这个和模除23即得到了校验和。其中各位的权值为:从低位向高位数,假设某位为第n位,则当n模除17为0时,权值为13, 则当模n除17为1时,权值为16, 则当模n除17为2时,权值为30, 则当n模除17为3时,权值为17, 则当n模除17为4时,权值为8, 则当模n除17为5时,权值为24, 则当n模除17为6时,权值为21, 则当模n除17为7时,权值为3, 则当模n除17为8时,权值为9, 则当模n除17为9时,权值为12, 则当n模除17为10时,权值为10, 则当n模除17为11时,权值为4, 则当n模除17为12时,权值为6, 则当n模除17为13时,权值为14, 则当n模除17为14时,权值为15, 则当n模除17为15时,权值为29, 则当n模除17为16时,权值为11。现请你写一段程序来计算这个校验和。

输入格式:
只有一行,为一个长度不超过1000且仅包含数字的字符串。

输出格式:
为上述规则下该字符串的校验和。测试用例保证所有整数可以用 int存储。

输入样例:
85302688978758327

输出样例:
21

求校验和
最佳答案
2023-12-9 13:23:06
在C语言中,可以使用数组来存储各位的权值,然后根据题目要求求出校验和。代码如下面所示:
#include <stdio.h>
#include <string.h>

#define MAX 1005

int main() {
    char str[MAX];
    while (scanf("%s", str) != EOF) {
        int weights[17] = {13, 16, 30, 17, 8, 24, 21, 3, 9, 12, 10, 4, 6, 14, 15, 29, 11};
        long long int checksum = 0;
        int len = strlen(str);
        for (int i = len - 1; i >= 0; --i) {
            checksum += ((str[i] - '0') * weights[(len - i) % 17]);
        }
        printf("%lld\n", checksum % 23);
    }
    return 0;
}

在上面的代码中,我们首先定义了一个数组用来存储各位的权值。然后,我们读取输入的字符串,并获取其长度。在一个循环中,我们从低位向高位遍历字符串的每一位,计算每一位的数值与其对应的权值的乘积,并将所有的乘积相加,得到校验和。最后,我们打印出校验和模除23的结果。

需要注意的是,C语言中的字符与数字的转换可以通过减去字符'0'实现。此外,由于校验和可能会很大,我们需要使用长整型来存储校验和。此外,由于数组的索引是从0开始的,因此在计算权值时,需要将字符串长度减去当前索引再模除17。

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-20 11:08:02 | 显示全部楼层
下面是用C语言编写的计算校验和的程序:
#include <stdio.h>#include <string.h>int calculateChecksum(char *str) {    int weights[] = {13, 16, 30, 17, 8, 24, 21, 3, 9, 12, 10, 4, 6, 14, 15, 29, 11};    int length = strlen(str);    int checksum = 0;    for (int i = 0; i < length; i++) {        int digit = str[i] - '0';        int weight = weights[i % 17];        checksum += digit * weight;    }    return checksum % 23;}int main() {    char str[1001];    printf("请输入一个由数字组成的字符串:\n");    scanf("%s", str);    int checksum = calculateChecksum(str);    printf("校验和为:%d\n", checksum);    return 0;}
这段程序通过定义一个权值数组,遍历输入的字符串中的每一位数字,并根据对应的权值进行相乘和累加操作,最后取得到的和模除23得到校验和。

希望能帮助到你!如果还有其他问题,请随时提出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-20 11:11:34 | 显示全部楼层
#include <stdio.h>
#include <string.h>

int main() {
    char str[1001];
    scanf("%s", str);
    int len = strlen(str);
    int weights[17] = {13, 16, 30, 17, 8, 24, 21, 3, 9, 12, 10, 4, 6, 14, 15, 29, 11};
    int sum = 0;
    for (int i = 0; i < len; i++) {
        int digit = str[len - 1 - i] - '0';
        int weight = weights[i % 17];
        sum += digit * weight;
    }
    int checksum = sum % 23;
    printf("%d\n", checksum);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-9 13:23:06 | 显示全部楼层    本楼为最佳答案   
在C语言中,可以使用数组来存储各位的权值,然后根据题目要求求出校验和。代码如下面所示:
#include <stdio.h>
#include <string.h>

#define MAX 1005

int main() {
    char str[MAX];
    while (scanf("%s", str) != EOF) {
        int weights[17] = {13, 16, 30, 17, 8, 24, 21, 3, 9, 12, 10, 4, 6, 14, 15, 29, 11};
        long long int checksum = 0;
        int len = strlen(str);
        for (int i = len - 1; i >= 0; --i) {
            checksum += ((str[i] - '0') * weights[(len - i) % 17]);
        }
        printf("%lld\n", checksum % 23);
    }
    return 0;
}

在上面的代码中,我们首先定义了一个数组用来存储各位的权值。然后,我们读取输入的字符串,并获取其长度。在一个循环中,我们从低位向高位遍历字符串的每一位,计算每一位的数值与其对应的权值的乘积,并将所有的乘积相加,得到校验和。最后,我们打印出校验和模除23的结果。

需要注意的是,C语言中的字符与数字的转换可以通过减去字符'0'实现。此外,由于校验和可能会很大,我们需要使用长整型来存储校验和。此外,由于数组的索引是从0开始的,因此在计算权值时,需要将字符串长度减去当前索引再模除17。

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 17:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表