Mister-小方


私信TA

用户名:1104986125

访问量:236953

签 名:

如此英俊为哪般

等  级
排  名 3
经  验 35431
参赛次数 1
文章发表 68
年  龄 19
在职情况 学生
学  校 大连交通大学
专  业 车辆工程

  自我简介:

解题思路:

  1. 定义多个函数,分别处理遇到的问题,用户输入的位数,数字反向相加,判断同文数。

  2. 用数组去接收用户输入的第二个数会让后面的计算起来简单很多。


  1. 参考代码:

#include<stdio.h>
#include<math.h>
#include <string.h>
#include <stdlib.h>
int stod(char s[],int a[]);
int plus(int a[],int n,int m);
int check(int a[],int n);

int p;
char s[1000];
int c[1000];

main()
{
    int n,i;
    scanf("%d",&p);                 //接收进制
    scanf("%s",s);                  //用数组接收用户输入的第一个数
    n=stod(s,c);                    //判断用户输入了几位数,并传给n
    for(i=0;i<30;i++)
    {
       n=plus(c,n,p);               //相加
       if(check(c,n)==1)            //判断是否为回文数
         {
            printf("STEP=%d\n",i+1);
            break;
         }
    }
    if(i>=30)
      printf("Impossible!\n");
}

int  stod(char s[],int a[])                //统计位数
{
     int i;     //判断用户输入的为几位数的数字
     for(i=0;s[i]!='\0';i++)
        if(s[i]>='A'&&s[i]<='F')          //10到16进制数
           a[i]=10+s[i]-'A';              //给数组c赋值
        else                              //2到10进制数
           a[i]=s[i]-'0';
     return i;  //返回位数给n
}

int plus(int a[],int n,int m)   //计算a=a+a反
{
     int *b,i,j,k;
     b=(int *)malloc(sizeof(int)*1001);//开辟空间
     for(i=0;i<n;i++)
        b[n-1-i]=a[i];  //把a反过来给b
     k=0;
     for(i=0;i<n;i++)
     {
        a[i]=a[i]+b[i]+k;
        k=a[i]/m;
        a[i]=a[i]%m;
     }
     if(k>0)
       a[n++]=k;
     free(b);
     return n;
}

int check(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;
}

看看大家还有什么不懂的请在下方评论区留言

 

0.0分

5 人评分

  评论区

谢谢小方了,思路超清晰呢,搞懂好多了
2019-12-15 21:43:58
int check(int a[],int n)       //判断a是否是回文             大佬这个返回的值是什么
2018-03-16 08:36:36
int plus(int a[],int n,int m)   这个函数 返回的是 a+a相加之后的值吗
2018-03-16 08:35:47
思路很清晰,代码也很整洁,很棒!我一下就看懂了,谢谢小方。我要向你学习
2017-08-21 10:49:49
  • «
  • 1
  • »