有一個裝著十六進制數的陣列(比較長),現在要把它轉換成十進制輸出。
整形變數不夠長,如何把新的十進制數裝進陣列輸出?
uj5u.com熱心網友回復:
可以再細化一下需求,這個16進制陣列是什么樣的?如果是一個陣列,那么一個元素一個元素的,如果是一個很大的數,從最低位開始,依次*16^n,n根據位數不同值不同。uj5u.com熱心網友回復:
比如 char a[] = "999876543210"(就先不帶字母,省點事)然后我想把它轉化成十進制數輸出。
比如我int sum;
這時候隨著運算位數增加,數值就會溢位了。
uj5u.com熱心網友回復:
我倒是知道怎么把十六進制轉化為十進制,但對于位數過多的就沒辦法了。。。uj5u.com熱心網友回復:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NUM_LEN 2048
int cal_factorial(unsigned char *num_list, int num_size, int n);
int cal_val(unsigned char *num_list, int num_size, int base, int num)
{
int i = 0, j;
int len = 1, tmp, carry_bit;
num_list[1] = 1;
while (i < num) {
carry_bit = 0;
for (j = 1; j <= len; j++) {
tmp = num_list[j] * base + carry_bit;
num_list[j] = tmp % 10;
carry_bit = tmp / 10;
if (j >= len && carry_bit != 0)
len++;
if (num_size-1 < len) {/* overflow */
printf("Overflow!\n");
return num_size-1;
}
}
i++;
}
return len;
}
int main(void)
{
unsigned char num_list[MAX_NUM_LEN];
int num_len, i;
int base, power;
memset(num_list, 0, sizeof(num_list));
printf("Please input two numbers: ");
scanf("%d%d", &base, &power);
if (base < 0 && power % 2)
num_list[0] = 1; /* negative number */
else
num_list[0] = 0;
base = abs(base);
num_len = cal_val(num_list, MAX_NUM_LEN, base, power);
printf("len = %d\n", num_len);
if (num_list[0])
putchar('-');
for (i = num_len; i >= 1; i--)
printf("%d", num_list[i]);
printf("\n");
return 0;
}
int cal_factorial(unsigned char *num_list, int num_size, int n)
{
int carry_bit, i, j, len = 1;
int tmp;
num_list[1] = 1;
for (i = 2; i <= n; i++)
{
carry_bit = 0;
for (j = 1; j <= len; j++) {
tmp = num_list[j] * i + carry_bit;
num_list[j] = tmp % 10;
carry_bit = tmp / 10;
if (j >= len && carry_bit != 0)
len++;
if (num_size -1 < len) { /* overflow */
printf("Overflow!\n");
return num_size-1;
}
}
}
/*
for (i = len; i >= 1; i--)//逆序輸出陣列就是結果
printf("%d", a[i]);
printf("\n");
*/
return len;
}
供參考~
uj5u.com熱心網友回復:
這是題目:十六進制轉換十進制
輸入一個字串(字串的長度不超過20),對其做如下處理:濾去所有的非十六進制字符后,組成一個新字串(十六進制形式),然后將其轉換為十進制數后輸出。
# include<stdio.h>
int main(void)
{
char input[21] = {};
char after[21] = {};
char hex[17] = "0123456789ABCDEF";
double sum=0;
int i, j, k=0;
printf("輸入一個長度不超過20的字串:");
gets(input);
for (i=0; i<20; i++) //所有小寫變大寫
{
if (input[i] >= 'a' && input[i] <= 'z')
{
input[i] = input[i] - 32;
}
}
for (i=0; i<20; i++) // 判斷是否為十六進制符號
{
for(j=0; j<16; j++)
{
if (input[i] == hex[j])
{
after[k] = input[i]; //賦值給新的字串
k++;
}
}
}
printf("\n十六進制:0x%s\n",after);
for(i=0; i<k; i++) //十六進制轉化為十進制
{
if (after[i]>'9' || after[i]<'0')
after[i] = (int)(after[i] - 'A'+10);
else
after[i] = (int)(after[i] - '0');
}
for(i=0; i<k-1; i++)
{
sum = (sum + after[i]) * 16;
}
sum += after[i];
printf("%d",sum);
return 0;
}
輸入的字符一長就不行了...
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/211479.html
標籤:新手樂園
