对待进制转换问题:除了10进制,其余进制都用字符数组来存储,或者用数组来存储,注意先后顺序:
2973:shew数:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int ten(char *str)
{
int ret=0;
int sum=0;
int i,len;
int temp=0;
len=strlen(str);
for(i=0;i<len;i++)
{
ret*=2;
ret+=str[i]-'0';
temp+=str[i]-'0';
}
sum=ret*2-temp;
return sum;
}
int main()
{
char skew[40];
int j=0;
int i;
int *result=(int *)malloc(sizeof(int));//存放结果的数组;
while(strcmp(skew,"0")!=0)
{
gets(skew);
// int result;
result[j]=ten(skew);
j++;
if(result[j]>2147483647)
return -1;
// printf("result[%d]=%d\n",j,result[j-1]);
}
for(i=0;i<j-1;i++)
{
printf("%d\n",result[i]);
}
return 0;
}
2734:10进制转换为8进制:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int a;
scanf("%d",&a);
if(a<=0||a>=65536)
return -1;
int ten[10];
int i=0;
int j;
while(a>=8)
{
ten[i]=a%8;
i++;
a=a/8;
}
ten[i]=a;
for(j=i;j>=0;j--)
printf("%d",ten[j]);
return 0;
}
2735:10进制转换为8进制:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[10];
gets(str);
int len;
len=strlen(str);
int i;
int ret=0;
for(i=0;i<len;i++)
{
ret*=8;
ret+=str[i]-'0';
}
printf("%d",ret);
return 0;
}
2765:2进制转换为16进制:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main()
{
char str[10001];
int i,j,ret,a,n,len;
scanf("%d",&n);
int m=0;
int result[n][2501];
int b[n];
getchar();//去掉回车输入 防止误以为是字符串
while(n--){
gets(str);
len=strlen(str);
j=0;
for(i=len-1;i>=0;)
{
a=4;
ret=0;
int k=0;
while(a--){
if(i<0)
break;
ret+=(str[i]-'0')*pow(2,k);
k++;
i--;
}
if(ret>=10)
{
result[m][j]=ret+55;
}
else{
result[m][j]=ret;
}
j++;
}
b[m]=j;
m++;
}
int k;
for(k=0;k<m;k++){
for(i=b[k]-1;i>=0;i--)
{
if(result[k][i]>=10)
printf("%c",result[k][i]);
else{
printf("%d",result[k][i]);
}
}
printf("\n");
}
return 0;
}
2765:八进制小数
这道题存在的一个问题就是小数点后面数的精度问题,无论是double还是long double,都无法达到30多位的小数精度,所以这时候就要用字符数组来存储小数点后面的位数,
而且要将初始公式:0.75 [8] =(7/8+5/64) [10],改成这样的公式:
0.75 [8] =(5/8+7) /8 [10]
这道题让我用了很长时间来思考小数点后这么多的位数如何正确显示,后来百度之才找到了方法,姜还是老的辣,我需要多学习别人的程序,找到自己的不足之处,然后进步。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main()
{
char str[10000];//输入一个八进制小数
int x,i,j,len;
double d;
double sum;
char output[10000]={'0'};
int temp;
while(gets(str))
{
sum=0;
len=strlen(str);
int index=0;//存放十进制的位数
int num=0;//num为也是下面的余数
for(i=len-1;i>=2;i--)
{
num=str[i]-'0';
for(j=0;(j<index)||num;j++)
{
//printf("j=%d,index=%d,%d,+what %d\n",j,index,j<index,j<index?output[j]-'0':0);
temp=num*10+(j<index?output[j]-'0':0);//商
//printf("i=%d,j=%d,num=%d,temp=%d,output[%d]=%d\n",i,j,num,temp,j,output[j]-'0');
output[j]=temp/8+'0';
num=temp%8;
}
index=j;
}
output[index]='\0';
printf("%s [8] = 0.%s [10]\n",str,output);
}
return 0;
}