m0_74153183 2022-10-30 16:03 采纳率: 95.5%
浏览 106
已结题

为什么我有几个测试点过不了。给定一个数,请将该数各个位上数字反转得到一个新数。

问题遇到的现象和发生背景

img


给定一个数,请将该数各个位上数字反转得到一个新数。

img

这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为 00(除非小数部分除了 00 没有别的数,那么只保留1个 00);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为 00),本次没有负数。

题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。

这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。

整数反转是将所有数位对调。

小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。

分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。

百分数的分子一定是整数,百分数只改变数字部分。

输入格式
一个实数 ss

输出格式
一个实数,即 ss 的反转数

img

用代码块功能插入代码,请勿粘贴截图
#include<stdio.h>
#include<string.h>
int main()
{
    char a[10000];
    gets(a);
    int len = strlen(a);
    int flag = 0,count=0,count2=0;
    for (int i = 0; i < len; i++)
    {
        if (a[i] == '.') { flag = 1; count = i; break; }
        else if (a[i] == '%') { flag = 2; count = i; break; }
        else if (a[i] == '/') { flag = 3; count = i; break; }
        else { flag = 0; }
    }
    int count1 = count + 1;
        if (flag==1)
        {
            int j =count-1;
            while (a[j]=='0')
            {
                    j--;
            }
            for (int k =j; k >=0; k--)
            {
                putchar(a[k]);
            }
            printf(".");
            for(int q=count+1;q<len;q++)
            {
                if (a[q] != '0')
                {
                    count2 = 1;
                    break;
                } 
            }
            if (count2) {
                j = len - 1;
                while (a[j] == '0')
                {
                    j--;
                }
                for (int k = j; k >= count1; k--)
                {
                    putchar(a[k]);
                }
            }
            if (count2 == 0)
                putchar('0');
        }
        else if (flag==3)
        {
            int j = count-1;
            while (a[j] == '0')
            {
                j--;
            }
            for (int k = j; k >= 0; k--)
            {
                /*printf("%c", a[k]);*/
                putchar(a[k]);
            }
            printf("/");
            j = len - 1;
            while (a[j] == '0')
            {
                j--;
            }
            for (int k = j; k > count; k--)
            {
                /*printf("%c", a[k]);*/
                putchar(a[k]);
            }
        /*    return 0;*/
        }
        else if (flag==2)
        {
            int j = len - 2;
            while (a[j] == '0')
            {
                j--;
            }
            for (int k = j; k >= 0; k--)
            {
                /*printf("%c", a[k]);*/
                putchar(a[k]);
            }
            /*printf("%");*/
            putchar(a[len - 1]);
            /*return 0;*/
        }
        else if (flag == 0)
        {
            int i = len - 1;
            while (a[i] == '0')
            {
                i--;
            }
            for (int j = i; j >= 0; j--)
            {
                /*printf("%c", a[j]);*/
                putchar(a[j]);
            }
        }
            return 0;
}

运行结果及报错内容

img

  • 写回答

2条回答 默认 最新

  • [Pokemon]大猫猫 2022-10-30 16:33
    关注

    题主有一个重大的问题是,求字符串长度哪里,是没有\0 的,导致你计算的长度有可能不准

    29行for循环用来判断小数前面是否有0,q记录第一个非0的位置,43行k不应该大于等于q吗
    修改前:

    img


    修改后:

    img


    改动如下:

    img


    用你给的其他测试输入时没问题

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

报告相同问题?

问题事件

  • 系统已结题 11月14日
  • 已采纳回答 11月6日
  • 修改了问题 10月30日
  • 创建了问题 10月30日

悬赏问题

  • ¥15 CATIA有些零件打开直接单机确定终止
  • ¥15 请问有会的吗,用MATLAB做
  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
  • ¥15 ARIMA模型时间序列预测用pathon解决
  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序,怎么查看客户esp32板子上程序及烧录地址