| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1508 人关注过本帖
标题:求助!!关于程序纠错 NOIP1999的回文数
只看楼主 加入收藏
zwh2530
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-5-15
结帖率:0
收藏
已结贴  问题点数:20 回复次数:3 
求助!!关于程序纠错 NOIP1999的回文数
试题来源
  NOIP1999 提高组
问题描述
  若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
  例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。
  又如:对于10进制数87:
  STEP1:87+78 = 165 STEP2:165+561 = 726
  STEP3:726+627 = 1353 STEP4:1353+3531 = 4884
  在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
  写一个程序,给定一个N(2<=N<=10或N=16)进制数M(其中16进制数字为0-9与A-F),求最少经过几步可以得到回文数。
  如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
输入格式
  两行,N与M
输出格式
  如果能在30步以内得到回文数,输出“STEP=xx”(不含引号),其中xx是步数;否则输出一行”Impossible!”(不含引号)
样例输入
9
87
样例输出
STEP=6

特别奇怪为什么总有一组测试数据,无法通过,而我试了多组数据,结果都没有错。。。无法明白原因所以求助

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int p;
char s[1000];
int  c[1000];
void fx()
{ int a;
  int i;
  int k=strlen(s);
  c[0]=0 ;
  if(p!=16)
 { for(i=0;i<k;i++)
   {a=s[i]+s[k-i-1]-2*'0';
    c[i+1]=a;
   }
   for(i=k;i>=1;i--)
   {if (c[i]>=p)
     {  c[i-1]+=c[i]/p;
       c[i]=c[i]%p;
     }
   }
   if(c[0]!=0)
   {for(i=0;i<=k;i++)
    {s[i]=c[i]+'0';}
   }
   else
    {
     for(i=0;i<k;i++)
      {s[i]=c[i+1]+'0';}
    }

 }
else
{
for(i=0;i<k;i++)
   {a=s[i]+s[k-i-1]-2*'0';
    c[i+1]=a;
   }
   for(i=k;i>=1;i--)
   {
if (c[i]>=p)
     {  c[i-1]+=c[i]/p;
       c[i]=c[i]%p;
     }
   }
   if(c[0]!=0)
   {for(i=0;i<=k;i++)
    {if(c[i]>=10)
 {s[i]=c[i]-10+'A';}
 else
 {s[i]=c[i]+'0';}
    }
   }
   else
   {
     for(i=0;i<k;i++)
      {
      if(c[i+1]>=10)
 {s[i]=c[i+1]-10+'A';}
 else
 {s[i]=c[i+1]+'0';}
      }
   }
}
}
bool hw()
{   int i;
int k=strlen(s);
for(i=0;i<k;i++)
  {if (s[i]!=s[k-1-i])
    return 0;
  }
   return 1;
}
int main()
{ int i;
 for(i=0;i<1000;i++)
  {c[i]=0;}
 scanf("%d",&p);
 scanf("%s",s);
 int l=strlen(s);
 if(p==16)
 {for(i=0;i<l;i++)
  {if(s[i]>='A' &&s[i]<='F')
    s[i]='0'+s[i]-'A'+10;

  }
 }
 int k=0;
 while(!hw())
 {fx();k++;if(k>30) {break;}}
 if(k<=30)
 {printf("STEP=%d",k);}
 else
 {printf("Impossible!");}
 system("pause");
 return 0;
}
2013-05-15 18:04
apull
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:三体星系
等 级:版主
威 望:216
帖 子:1506
专家分:9241
注 册:2010-3-16
收藏
得分:10 
已经有人问过类似的题了。
https://bbs.bccn.net/viewthread.php?tid=406902&page=1
2013-05-15 19:26
zwh2530
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-5-15
收藏
得分:0 
回复 2楼 apull
嗯,我见过相关的回文数的程序,当然也查过这道题的答案,可以我却一直找不到我的程序错在哪里,因为我试了很多组数据都是对了,所以来求助。
2013-05-15 19:48
helloUJS
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:168
专家分:731
注 册:2013-3-27
收藏
得分:10 
#include<stdio.h>
#include<math.h>
#include <string.h>
#include <stdlib.h>
int p;
char s[1000];
int c[1000];
int reverse(int a[],int n) /*判断a是否是回文*/
{
    int i,j;
    i=0;
    j=n-1;
    while(i<j&&a[i]==a[j])
    {
       i++;
       j--;
    }
    return i>=j;
}
int aplus(int a[],int n,int m)   /*计算a=a+a*/
{
     int *b,i,j,kc;
     b=(int *)malloc(sizeof(int)*1001);
     for(i=0;i<n;i++)
        b[n-1-i]=a[i];
     kc=0;
     for(i=0;i<n;i++)
     {
        a[i]=a[i]+b[i]+kc;
        kc=a[i]/m;
        a[i]=a[i]%m;
     }
     if(kc>0)
       a[n++]=kc;
     free(b);
     return n;
}
int  stod(char s[],int a[])
{
     int i;
     for(i=0;s[i]!='\0';i++)
        if(s[i]>='A'&&s[i]<='F')
           a[i]=10+s[i]-'A';
        else
           a[i]=s[i]-'0';
     return i;
}
main()
{
    int n,i;
    scanf("%d",&p);
    scanf("%s",s);
    n=stod(s,c);
    for(i=0;i<30;i++)
    {
       n=aplus(c,n,p);
       if(reverse(c,n)==1)
         {
            printf("STEP=%d\n",i+1);
            break;
         }
    }
    if(i>=30)
      printf("Impossible!\n");
}
写了一个供参考
2013-05-17 21:32
快速回复:求助!!关于程序纠错 NOIP1999的回文数
数据加载中...
 
   



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

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