| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5239 人关注过本帖
标题:各种进制之间的转换
只看楼主 加入收藏
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
结帖率:100%
收藏
已结贴  问题点数:50 回复次数:10 
各种进制之间的转换
我编了一个小的程序,但调试成功,并且输入有些是对的,但有些是错误的。比如说输入a,我实在是想不出哪错了,各位帮帮我,感激不尽,谢谢!
/*这个程序是用回来对各种进制之间的转换(2到32),由于我是初学者,所以不考虑小数*/
#include "stdio.h"
#include "math.h"
#include "string.h"
#define N 100
int pow1(int a,int b) /*次函数的功能类似有math.h中的pow,但本函数返回的是整数*/
       { int c;
         if(b==0) return 1;
         if(b>0) c=a*pow1(a,b-1);
         return c;
       }
 void f(int sum,int c,char *p,int i)/*此函数用来确定转换后的数字的各个位数上的数*/
       { int j,n;            
         for(n=i;n>=0;n--)
         for(j=0;j<c;j++)
         if(sum<(pow1(c,n)*(j+1))&&sum>=(pow1(c,n)*j)) { *(p+i-n)=j,sum=sum-pow1(c,n)*j;break;}
        
       }
int w(int sum,int c)/*此函数用来判断转换后的数字有几位(i+1)*/
       {int i;
        for(i=0; ;i++)
         {
          if((sum<pow1(c,i+1))&&(sum>=pow1(c,i))) break;
         }
        return i;
       }

     
main()
{int a,c,i,sum=0,j,k,l;
 char b[N]={0},h[200]={0};
 for(;;)
 {
  printf("***************************************************\n");
  printf("**            ^_^  WELCOME  ^_^                  **\n");
  printf("***************************************************\n");
  printf("    请输入你所要转换的数(输入0退出):");
  scanf("%s",b);  l=strlen(b);
  if(!strcmp(b,"0")) break;
  printf("        你所输入的数的进制为(2到32):");
  scanf("%d",&a);
  printf("请输入你要把该数转换为的进制(2到32):");
  scanf("%d",&c);
  for(i=0;b[i]!=0;i++)  /*由于输入的是字符,所以用以下转换*/
    {  if(b[i]>='0'&&b[i]<='9')
          b[i]-='0';
       if(b[i]>='a'&&b[i]<='z')
          b[i]=b[i]-'a'+10;
       if(b[i]>='A'&&b[i]<='Z')
          b[i]=b[i]-'A'+10;

    }
  for(j=0;j<l;j++)
     sum=sum+pow1(a,j)*b[l-j-1]; /*把输入的数字转换为十进制数*/
  i=w(sum,c); /*判断最高位*/
  f(sum,c,h,i);
   for(k=i;k>=0;k--) /*以下转换是把相应的数字转换为字符*/
    {  if(h[k]>=0&&b[k]<=9)
          {h[k]=h[k]+'0';continue;}
       if(h[k]>=10&&b[k]<=35)
          {h[k]=h[k]+55;continue;}
    }
   printf("把该数字从%d进制转化到%d 进制为:",a,c);puts(h);
 }
}
搜索更多相关主题的帖子: return 
2011-04-27 22:48
boxinchao
Rank: 4
等 级:业余侠客
帖 子:51
专家分:231
注 册:2011-4-13
收藏
得分:5 
  scanf("%s",&b);  l=strlen(b);
这个问题论坛里最近提到过好多次了,是漏了吧
2011-04-27 23:07
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
收藏
得分:0 
回复 2楼 boxinchao
什么漏了?我在论坛里没有看到啊,大哥,你就指点一二吧,谢谢!

人得一生得奋斗!
2011-04-27 23:25
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
以下是引用boxinchao在2011-4-27 23:07:27的发言:

  scanf("%s",&b);  l=strlen(b);这个问题论坛里最近提到过好多次了,是漏了吧

输入字符数组,不需要加&

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-04-27 23:34
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
收藏
得分:0 
我用的是字符数组,我试了一下,加和不加都可以运行,但我的问题仍然没有解决,输入一些数字的时候输出的是对的,但输入其他一下就输出错误的结果,比如说输入a。谢谢你!

人得一生得奋斗!
2011-04-27 23:40
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
进制转换通常使用辗转相除取余的方法。看不大懂楼主的程序

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-04-27 23:43
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
收藏
得分:0 
回复 6楼 ansic
我是用我自己的方法,我知道辗转相除法,但我想试试把握自己的想法实现,虽然我的做法比较啰嗦,但我是一名新手、菜鸟一级的人,所以我想多练练!我的标注也有问题啊!谢谢你!

[ 本帖最后由 饭桶 于 2011-4-27 23:49 编辑 ]

人得一生得奋斗!
2011-04-27 23:47
唯我独魔
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:176
专家分:782
注 册:2011-4-13
收藏
得分:10 
首先for(;;)
{
 sum=0//要加上这句
  printf("***************************************************\n");
  printf("**            ^_^  WELCOME  ^_^                  **\n");
  printf("***************************************************\n");
  printf("    请输入你所要转换的数(输入0退出):");
 其他的我也不知道错哪里了,我也是新手
2011-04-28 11:35
唯我独魔
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:176
专家分:782
注 册:2011-4-13
收藏
得分:30 
总共有三个错误,f函数中要加上*(p+i+1)=0;还有main中每次循环都要初始化sum=0;还有最后的字符转换时b和h有地方写错了,下面是改正后的程序
#include "stdio.h"
#include "math.h"
#include "string.h"
#define N 100
int pow1(int a,int b) /*次函数的功能类似有math.h中的pow,但本函数返回的是整数*/
       { int c;
         if(b==0) return 1;
         if(b>0) c=a*pow1(a,b-1);
         return c;
       }
void f(int sum,int c,char *p,int i)/*此函数用来确定转换后的数字的各个位数上的数*/
       { int j,n;            
         for(n=i;n>=0;n--)
         for(j=0;j<c;j++)
         if(sum<(pow1(c,n)*(j+1))&&sum>=(pow1(c,n)*j)) { *(p+i-n)=j,sum=sum-pow1(c,n)*j;break;}
        *(p+i+1)=0;
       }
int w(int sum,int c)/*此函数用来判断转换后的数字有几位(i+1)*/
       {int i;
        for(i=0; ;i++)
         {
          if((sum<pow1(c,i+1))&&(sum>=pow1(c,i))) break;
         }
        return i;
       }

     
main()
{int a,c,i,sum=0,j,k,l;
char b[N]={0},h[200]={0};
for(;;)
{sum=0;
  printf("***************************************************\n");
  printf("**            ^_^  WELCOME  ^_^                  **\n");
  printf("***************************************************\n");
  printf("    请输入你所要转换的数(输入0退出):");
  scanf("%s",b);  l=strlen(b);
  if(!strcmp(b,"0")) break;
  printf("        你所输入的数的进制为(2到32):");
  scanf("%d",&a);
  printf("请输入你要把该数转换为的进制(2到32):");
  scanf("%d",&c);
  for(i=0;b[i]!=0;i++)  /*由于输入的是字符,所以用以下转换*/
    {  if(b[i]>='0'&&b[i]<='9')
          b[i]-='0';
       if(b[i]>='a'&&b[i]<='z')
          b[i]=b[i]-'a'+10;
       if(b[i]>='A'&&b[i]<='Z')
          b[i]=b[i]-'A'+10;

    }
  for(j=0;j<l;j++)
     sum=sum+pow1(a,j)*b[l-j-1]; /*把输入的数字转换为十进制数*/
  i=w(sum,c); /*判断最高位*/
  f(sum,c,h,i);
   for(k=i;k>=0;k--) /*以下转换是把相应的数字转换为字符*/
    {  if(h[k]>=0&&h[k]<=9)
          {h[k]=h[k]+'0';continue;}
       if(h[k]>=10&&h[k]<=35)
          {h[k]=h[k]+55;continue;}
    }
   printf("把该数字从%d进制转化到%d 进制为:",a,c);puts(h);
}
}
2011-04-28 13:21
crystal0418
Rank: 1
来 自:福建福州
等 级:新手上路
帖 子:6
专家分:6
注 册:2011-4-26
收藏
得分:5 
回复 2楼 boxinchao
字符数组名就是一个地址了

等我毕业,就两年,记住哦
2011-04-28 13:31
快速回复:各种进制之间的转换
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033059 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved