1.输入一个十进制的数,把它变成八进制,类似的把十进制变成 16 进制, 把十六进制转变为十进制等。
#include<stdio.h>
#include<math.h>
int i,j;
char sixteen[10000];
//十进制转化成八进制
int tentoeight(int a)
{
int res=0,k=0;
while(a)
{
res+=a%8*((int)pow(10,k));
k++;
a/=8;
// printf("%d\n",res);
}
return res;
}
//十进制转化成十六进制
void tentosixteen(int a)
{
int k=0;
while(a)
{
if(a%16>9)
sixteen[k++]=a%16+55;
else
sixteen[k++]=a%16+'0';
a/=16;
}
for(i=k-1;i>=0;i--)
printf("%c",sixteen[i]);
printf("\n");
}
//十六进制转化成十进制
void sixteentoten(char *sixt)
{
int res=0;
int l=strlen(sixt);
for(i=0;i<l;i++)
{
if(sixt[i]>='0'&&sixt[i]<='9')
res+=(sixt[i]-'0')*(int)pow(16,l-i-1);
else
res+=(sixt[i]-55)*(int)pow(16,l-i-1);
}
printf("%d\n",res);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
printf("十进制转换成八进制:%d\n",tentoeight(n));
printf("十进制转化成十六进制:");
tentosixteen(n);
}
return 0;
}
这题目有些诡异,因为是回忆版,所以没有规定的输入输出,于是写了三个函数,十进制转化成八进制,转化成十六进制,跟十六进制转化成十进制。输出输入什么的就不计较了啊哈。
#include<stdio.h>
int n;
void main()
{
while(scanf("%d",&n)!=EOF)
{
printf("十进制转化成八进制后为:%o\n",n);
printf("十进制转化成十六进制后为:%X\n",n);
}
}
这种方法是偷懒的方法,是直接利用c语言里面有的输入输出格式就可以实现进制的转换。至于十六进制转化成十进制,就在输入时用%x,然后输出的时候用%d就行。如果%X里面的X大写的话,就说明输出或者输入的十六进制数里面的字母是大写。
2.输入两个非常大的整数(完全超出了 int、long 的表示范围),这个整数 的长度可能超过 100 位,计算并输出这两个数相加的结果。(HDU acm 1002 用 string 处理比较好)
#include<stdio.h>
#include<string.h>
char a[1000],b[1000],res[1000];
int i,j,l1,l2,temp;
void main()
{
int d,jw=0; //表示进位
memset(res,'\0',sizeof(res));
scanf("%s",&a);
getchar();
scanf("%s",&b);
l1=strlen(a);
l2=strlen(b);
1 if(l1>=l2)
{
d=l1-l2;
for(i=0;i<d;i++)
res[i]=a[i];
for(i=l1-1;i>=d;i--)
{
temp=a[i]-'0'+b[i-d]-'0'+jw;
res[i]=temp%10+'0';
jw=temp<10?0:1;
}
if(jw==1)
res[d-1]+=1;
for(i=0;i<l1;i++)
printf("%c",res[i]);
printf("\n");
}
else
{
d=l2-l1;
for(i=0;i<d;i++)
res[i]=b[i];
for(i=l2-1;i>=d;i--)
{
temp=b[i]-'0'+a[i-d]-'0'+jw;
res[i]=temp%10+'0';
jw=temp<10?0:1;
}
if(jw==1)
res[d-1]+=1;
for(i=0;i<l2;i++)
printf("%c",res[i]);
printf("\n");
}
}
我觉得判断l1跟l2谁长的后面,代码基本相同,但是暂时没想出来怎么改的更好。。