关于#c语言#的问题,请各位专家解答!

img

                               【问题描述】
                              十六进制数列累加求和。该数列有如下特征
                              1)每个数的位数长度固定,即数列中每个数字的位数是相同的
                              2)每个数从最高位开始,后面每位上的数字依次递增,达到该进制的最大编码数字后,重新开始
                              比如716进制数最高位是D,则这个数字为DEF0123
                              3)数列前一项的第2位数字是其后一项的第1位数字,直到最后一项的第1位数字是该进制的最大编
                              码。因此整个数列由第一个数的最高位数字和数的长度即可决定。比如416进制数列:9ABC
                              ABCD.BCDE,CDEF.DEFOEF01,F012
16 【输入格式】
                                一行,2个数据,空格分隔。分别表示第1个数的最高位编码和数的位数
  h+
                                【输出格式】
                               数列累加求和结果的十进制数
                                【样例输入】
                               94
                                【样例输出】
                               364377

#include<stdio.h>
#include<math.h>
int main()
{
int m,n;
scanf("%x%x",&m,&n);
long s[16-m+1][n+1];
int i,j,k=m;
for(i=1;i<=(16-m);i++)
{
for(j=1;j<=n;j++)
{
s[i][j]=k+j-1;
if(s[i][j]>=16)
{
s[i][j]=(k+j-1)-16;
}
}
k+=1;
}
long long sum[16-m+1]={0};
int h=1;
for(h;h<=16-m;h++)
{
sum[h]=0;
}
for(i=1;i<=16-m;i++)
{
long long z=0;
for(j=1;j<=n;j++)
{
z+=s[i][j]*pow(16,(n-j));
}
sum[i]=z;
}
long long summ=0;
for(i=1;i<=16-m;i++)
{
summ+=sum[i];
}
printf("%lld",summ);
return 0;
}

n 是数的位数应该用%d 以十进制读取,不应该以十六进制%x读取
scanf("%x%d", &m, &n);

你题目的解答代码如下:

#include <stdio.h>
#include <math.h>
int main()
{
    int m, n;
    scanf("%x%d", &m, &n);
    long s[16 - m + 1][n + 1];
    int i, j, k = m;
    for (i = 1; i <= (16 - m); i++)
    {
        for (j = 1; j <= n; j++)
        {
            s[i][j] = k + j - 1;
            if (s[i][j] >= 16)
            {
                s[i][j] = (k + j - 1) - 16;
            }
        }
        k += 1;
    }
    long long sum[16 - m + 1]; //动态长度的数组不能用 = {0}设置初值
    int h = 1;
    for (h; h <= 16 - m; h++)
    {
        sum[h] = 0;
    }
    for (i = 1; i <= 16 - m; i++)
    {
        long long z = 0;
        for (j = 1; j <= n; j++)
        {
            z += s[i][j] * pow(16, (n - j));
        }
        sum[i] = z;
    }
    long long summ = 0;
    for (i = 1; i <= 16 - m; i++)
    {
        summ += sum[i];
    }
    printf("%lld", summ);
    return 0;
}

img

如有帮助,望采纳!谢谢!

代码修改如下:

#include <stdio.h>
#include <stdlib.h>
//将字符串转成数字
long long trans(char buf[],int n)
{
    int i;
    long long s = 0;
    for (i=0;i<n;i++)
    {
        if(buf[i]>='0' && buf[i] <='9')
            s = s*16 + buf[i]-'0';
        else if(buf[i]>='A' && buf[i] <='F')
            s = s*16 + 10 + buf[i]-'A';
        else if(buf[i]>='a' && buf[i] <='f')
            s = s*16 + 10 + buf[i]-'a';
    }
    return s;
}




int main()
{
    int i,j,n,ws;
    char start,ch;
    long long s = 0;
    char* p;
    scanf("%c %d",&start,&ws);
    p = (char*)malloc(ws+1);

    if(start >='a' && start <='f')
        start = start - 32; //转成大写字母

    p[0] = start;
    for(i=1;i<ws;i++)
    {
        p[i] = p[i-1] + 1;
        if(p[i] == ('9'+1))
            p[i] = 'A';
        if(p[i-1] == 'F')
            p[i] = '0';
    }
    p[ws] = 0;
    while(1)
    {
        s += trans(p,ws);
        if(p[0] == 'F')
            break;
        //移动
        for (i=0;i<ws-1;i++)
        {
            p[i] = p[i+1];
        }
        p[ws-1] = p[ws-2]+ 1;
        if(p[ws-1] == ('9' +1) )
            p[ws-1] = 'A';
        if(p[ws-2] == 'F')
            p[ws-1] = '0';
    }
    printf("%lld",s);
    free(p);
    p = 0;
    return 0;
}