隔壁王健喜儿 2023-01-02 12:44 采纳率: 96.2%
浏览 26
已结题

关于#xdojC语言#的问题

标题
拼数字

时间限制
1S

内存限制
1000Kb

问题描述
对于给定的字符序列(字符序列长度小于100),从左至右将所有数字字符取出拼接成一个无符号整数(拼接出的整数小于2^31)。
然后计算并输出该整数的最大因子(如果是素数或0,则其最大因子为自身)。

输入说明
输入数据为一行字符序列。

输出说明
对输入的字符序列,求出所得整数的最大因子;若字符序列中没有数字或找出的整数为0,则输出0。

输入样例
样例1输入
sdf0ejg3.f?9f
样例2输入
?4afd0s&2d79*(g
样例3输入
abcde

输出样例
样例1输出
13
样例2输出
857
样例3输出
0

以下是提取字符串中数字的代码,为什么有的结果总有偏差?

img

/*  
样例1输入
sdf0ejg3.f?9f
样例2输入
?4afd0s&2d79*(g
样例3输入
abcde

样例1输出
13
样例2输出
857
样例3输出
0
*/
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
    char a[101];
    scanf("%s", a);
    int n=strlen(a);
    int i, j, k, count=0;
    for (i=0; i<n; i++)
    {
        if (a[i]>='0' && a[i]<='9')
            count++;
    }
    int m, num=0;
    char b[count];
    int p=0;
    for (i=0; i<n; i++)
    {
        if (a[i]>='0' && a[i]<='9')
        {
            b[p]=a[i];
            p++;
        }
    }
    for (i=0; i<count; i++)
    {
        printf("%c ", b[i]);
        m=(b[i]-48)*pow(10, count-1-i);
        printf("%d\n", m);
        num+=m;
    }
    printf("\n\n");
    printf("%d\n", num);
    
    return 0;
}

  • 写回答

2条回答 默认 最新

  • a5156520 2023-01-02 13:15
    关注

    提取数字字符的代码出问题的原因可能是pow的返回值为double,而存储其结果的数据类型为int,所以可能会出错,可以用另外的方式来提取整数数字,然后可以把存储提取数字的变量num改为unsigned int类型,因为题目的提示是一个小于2^32-1的无符号数,修改如下:

    参考链接:


    /*  
    样例1输入
    sdf0ejg3.f?9f
    样例2输入
    ?4afd0s&2d79*(g
    样例3输入
    abcde
    样例1输出
    13
    样例2输出
    857
    样例3输出
    0
    */
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    int main()
    {
        char a[101];
        scanf("%s", a);
        int n=strlen(a);
        int i, j, k, count=0;
        for (i=0; i<n; i++)
        {
            if (a[i]>='0' && a[i]<='9')
                count++;
        }
        int m, num=0;
        char b[count];
        int p=0;
        
        for (i=0; i<n; i++)
        {
            if (a[i]>='0' && a[i]<='9')
            {
                b[p]=a[i];
                p++;
            }
        }
      //  printf("b=%s\n",b);
        
        unsigned int result=0; 
        int weight=1;
        for (i=0; i<count; i++)
        {
            int single=b[i]-'0';   // 当前数位数字 
            result=result*weight+single;
            // https://cloud.tencent.com/developer/article/2095844
           // printf("single=%d,b[%d]=%c,result=%u\n",single,i,b[i],result);
            weight=10;
    //        m=(b[i]-48)*pow(10, count-1-i);
    //        printf("%d\n", m);
    //        num+=m;
        }
       // printf("reslut=%u\n",result);
        
        //  https://blog.csdn.net/qq_51646682/article/details/121445581
       unsigned  int factor,t=2;
       int find=0;
       // 求最大因子 
        while(t<num){
            if(num%t==0){
            //    printf("t=%u\n",t);
                factor=t;
                find=1;
            }
            t++;
        }
        
        if(count==0||num==0){ // 字符序列没有数字或找出的整数为0 
            printf("0");
        }else{  // 如果有数字 
            if(find==0){ // 如果没有找到因子,则打印数字本身,主要指该数为1或为素数的情况 
                printf("%u",num);
            }else{  // 如果找到最大因子,则打印最大因子的结果 
                printf("%u",factor);
            }    
        }
        
        
        
    //    printf("\n\n");
    //    printf("%d\n", num);
        
        return 0;
    }
     
     
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月10日
  • 已采纳回答 1月2日
  • 创建了问题 1月2日

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?