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 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!