| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 630 人关注过本帖, 1 人收藏
标题:数制转换的题,查不出错来。。大家帮忙看下。。谢谢
只看楼主 加入收藏
宅宅
Rank: 1
等 级:新手上路
帖 子:27
专家分:9
注 册:2013-9-25
结帖率:92.86%
收藏(1)
已结贴  问题点数:16 回复次数:8 
数制转换的题,查不出错来。。大家帮忙看下。。谢谢
。。检查了两个周都没看出来哪错了,两个隐藏用例过不了


我们通常使用的都是十进制的数字,但其实在生活中也经常会使用其它进制。

这个题目会给你两个不同的数字,它们不属于同一进制,要求你计算出当它们分别处于何种进制之中时,两个数字相等。譬如 12 和 5 ,在十进制下它们是不等的,但若 12 使用 3 进制而 5 使用六进制或十进制时,它们的值就是相等的。因此只要选择合适的进制, 12 和 5 就可以是相等的。

程序的输入是两个数字 M 和 N( 其十进制的值不超过 1000000000) ,它们的进制在 2~36 之间。对于十以下的数字,用 0~9 表示,而十以上的数字,则使用大写的 A~Z 表示。

求出分别在 2~36 哪种进制下 M 和 N 相等。若相等则输出相应的进制,若不等则输出错误信息。当然了,对于多种可能成立的情况,找出符合要求的进制最小的一组就行了。信息的格式见测试用例。
例:
输入:12 5
输出:12 (base 3) = 5 (base 6)
输入:123 456
输出:123 is not equal to 456 in any base 2..36


程序代码:
#include<stdio.h>
#include<stdlib.h>
int cf(int m,int n)
{
    int i,d=1;
for(i=1;i<=n;i++)
d=d*m;
return (d);
} 

main()
{
  int a[30]={0},i,c,b[30]={0},n=0,m=0,max1=0,max2=0,d,sum1=0,sum2=0;
  char e[30],f[30];
  for(i=0;c!=' ';i++)//空格时结束循环
               {
               scanf("%c",&e[i]); //输入字符 
               c=e[i];
               a[i]=e[i]; //保存ASCII码
               n++;
               }
  n--; //输入的字符的数量 
  c=0;
  gets (f); //输入字符 
  for(i=0;f[i]!='\0';i++)
                         {
                         b[i]=f[i]; //ASCII码 
                         m++; //字符数量 
                         }
    for(i=0;i<=n-1;i++)
  {
                       if(a[i]>=48&&a[i]<=57) a[i]=a[i]-48;
                         else if(a[i]>=65&&a[i]<=90) a[i]=a[i]-55;
                              else a[i]=0;
  }//把a[i]变成每一位代表的数字 
  for(i=0;i<=m-1;i++)
  {
                     if(b[i]>=48&&b[i]<=56) b[i]=b[i]-48;
                          else if(b[i]>=65&&b[i]<=90) b[i]=b[i]-55;
                               else b[i]=0;
  }//把b[i]变成每一位代表的数字
  for(i=0;i<=n-1;i++)
                     if (a[i]>max1) max1=a[i];
  for(i=0;i<=m-1;i++)
                     if (b[i]>max2) max2=b[i]; //求最大值以确定最小进制 
  for(c=max1+1;c<=36;c++)
     {  
        sum1=0;
        for(d=0;d<=n-1;d++) sum1=sum1+a[d]*cf(c,n-1-d);//转化为10进制 
     for(i=max2+1;i<=36;i++)
        {
         sum2=0;
         for(d=0;d<=m-1;d++) sum2=sum2+b[d]*cf(i,m-1-d);//转化为10进制 
                            if(sum1==sum2) 
                                           {
                                            for (d=0;d<=n-1;d++) 
                                               printf("%c",e[d]); 
                                            printf(" (base %d) = ",c);
                                            d=0;
                                            while(f[d]==' ') d++;
                                            for (;d<=m-1;d++) 
                                                printf("%c",f[d]);
                                            printf(" (base %d)\n",i);
                                            goto k;
                                           } 
                            if(c==36&&i==36&&sum1!=sum2) 
                                                         {
                                                          for (i=0;i<=n-1;i++) 
                                                              printf("%c",e[i]); 
                                                          printf(" is not equal to ");
                                                          i=0;
                                                          while(f[i]==' ') i++;
                                                          for (;i<=m-1;i++) 
                                                              printf("%c",f[i]);
                                                          printf(" in any base 2..36\n");
                                                          goto k;
                                                         }
        } //输出结果 
     }
k:system("pause");
}
搜索更多相关主题的帖子: 十进制 
2013-11-07 11:12
pink_duo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:209
专家分:1054
注 册:2013-11-5
收藏
得分:6 
额,你这么多for循环看的两眼花,我按要求写了个程序,你参考看看,那么多有用的库函数
程序代码:
#include<stdio.h>
#include <stdlib.h>
#include <string.h>

void main()
{
   int data1,data2;
   char  d[35][32];  //2..36共35种进制,int类型一般有16位
   char  t[35][32];
   int i,j;
   int flag;

begin:
   flag = 0;
   i=j=0;

   printf("enter two datas:\n");
   scanf("%d %d",&data1,&data2);
   for(j=0;j<=34;j++)
   {
       itoa(data1,d[j],(j+2));  //itoa函数,可转任意进制
       itoa(data2,t[j],(j+2));      
   }
   
   for(i=0;i<=34;i++)
   {
       for(j=0;j<=34;j++)
       {
           if(strcmp(d[i],t[j]) == 0)  //比较两个字符串,如果相等返回0
           {
               flag = 1;
               break;
           }
       }
       if(flag)
       {
           break;
       }
   }
   if(flag)
   {
       printf("%d (base %d) = %d (base %d)\n",data1,(i+2),data2,(j+2));
   }
   else
   {
       printf("%d is not equal to %d in any base 2..36\n",data1,data2);
   }
   goto begin;
}
图片附件: 游客没有浏览图片的权限,请 登录注册

埋头做牛,抬头做人,低头做狗
2013-11-07 17:22
ssz8930
Rank: 2
等 级:论坛游民
帖 子:21
专家分:38
注 册:2012-10-30
收藏
得分:6 
L上的10以上的用字符表示的数 好像就没法比较了吧
2013-11-07 20:25
pink_duo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:209
专家分:1054
注 册:2013-11-5
收藏
得分:0 
楼上看看itoa的作用,实际测试下

埋头做牛,抬头做人,低头做狗
2013-11-08 08:43
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
收藏
得分:6 
帮顶
没时间看代码。。。
2013-11-08 10:19
宅宅
Rank: 1
等 级:新手上路
帖 子:27
专家分:9
注 册:2013-9-25
收藏
得分:0 
虽然到最后也没弄明白- -
2013-11-12 15:48
pink_duo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:209
专家分:1054
注 册:2013-11-5
收藏
得分:0 
以下是引用宅宅在2013-11-12 15:48:14的发言:

虽然到最后也没弄明白- -
你输入两个数,用itoa这个函数转换成各种进制,存入两个数组,再比较这两个数组中是否有相等的值

埋头做牛,抬头做人,低头做狗
2013-11-12 15:54
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53957
注 册:2011-1-18
收藏
得分:0 
C语言中有atoi函数,但没有itoa函数;itoa函数是VC特有的,不是C标准库中的

对于这道题,先找出a字符串和b字符串各自最小的进制,设为 i 和 j
如果 i>36 || j>36 则失败结束
如果 f(a,i) == f(b,j) 则成功结束
如果 f(a,i) < f(b,j),则i加一
如果 f(a,i) > f(b,j),则j加一
2013-11-12 16:31
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
int f(char *a, int base)
{
  int s = 0;
  for (int i = strlen(a)-1;i >= 0;--i)
  {
    s *= base, s += a[i] - '0';
  }
  return s;
}

函数返回数据a 在进制 base下的值(十进制)


[fly]存在即是合理[/fly]
2013-11-12 16:42
快速回复:数制转换的题,查不出错来。。大家帮忙看下。。谢谢
数据加载中...
 
   



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

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