【问题描述】
十六进制数列累加求和。该数列有如下特征
1)每个数的位数长度固定,即数列中每个数字的位数是相同的
2)每个数从最高位开始,后面每位上的数字依次递增,达到该进制的最大编码数字后,重新开始
比如7位16进制数最高位是D,则这个数字为DEF0123
3)数列前一项的第2位数字是其后一项的第1位数字,直到最后一项的第1位数字是该进制的最大编
码。因此整个数列由第一个数的最高位数字和数的长度即可决定。比如4位16进制数列: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;
}
如有帮助,望采纳!谢谢!
代码修改如下:
#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;
}