azusa~ 2022-08-13 12:06 采纳率: 25%
浏览 96
已结题

将数字的每一位倒序存入数组,再正序输出,为什么这样是错误的?

将数字的每一位倒序存入数组,再正序输出,为什么这样是错误的?

问题如下:
输入格式:
输入在一行中给出一个整数,如:1234。

提示:整数包括负数、零和正数。

输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。

yi er san si。

我的思路是先用一个数组存储数字的每一位,是倒序存储。再用另一个数组按顺序存储拼音(a[0]=ling a[1]=er这样),最后索引。 比如667,存入数组的就是7,6,6
因为存储拼音的数组是按顺序的,所以只要索引a[6]就可以

#include <stdio.h>
int  main(void)
{
    int n=0;
    int count = 0, i = 0;
    scanf("%d", &n);
    char a[10] = { 'ling','ling','er','san','si','wu','liu','qi','ba','jiu'};
    int b[100] = { 0 };
    if (n < 0)
    {
        printf("fu ");
        n = -n;
    }
    while (n != 0)
    {
        b[i] = n % 10;
        count++;
        i++;
        n /= 10;
    }
    printf("%d",count);
    for (int i = count - 1; i >= 0; i--)
    {
        printf("%d", a[b[i]]);
        if (i != 0)
            printf(" ");
    }
}

好像最后一个for循环部分是错的,有时候这样写还会栈溢出,这部分不太懂,求指点QAQ

在网上看到了一个C++的解法 为什么C++这样写for循环就是对的呀


#include<iostream>
#include<string>
using namespace std;
int main(){
    
    string a[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
    int z;
    int b[20];//存放整数的每位数字。
    cin>>z;
    int i=0;
    int count=0;//记录整数的一共有都少位。
    //分开讨论0.
    if(z==0) cout<<a[z];
   
    if(z<0) {
        cout<<"fu ";
        z=-z;
    }
      //循环用于存放整数的每个位。
    while(z){
            b[i]=z%10;
            z=z/10;
            count++;
            i++;
        }
     //输出结果。
        for(i=count-1;i>=0;i--){
            cout<<a[b[i]];
            if(i!=0) cout<<" ";//注意最后并没有空格。
        }
    return 0;
}
  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-08-13 14:57
    关注

    题主代码修改如下,见注释,供参考:

    #include <stdio.h>
    int  main(void)
    {
        int n=0;
        int count = 0, i = 0;
        scanf("%d", &n);
        //char a[10] = { 'ling','ling','er','san','si','wu','liu','qi','ba','jiu'};
        char* a[10] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};  //修改
        int b[100] = { 0 };
        if (n < 0)
        {
            printf("fu ");
            n = -n;
        }
        while (n != 0)
        {
            b[i++] = n % 10;
            //count++;  修改
            //i++;      修改
            n /= 10;
        }
        //printf("%d",count); 修改
        for (i--; i >= 0; i--)  //for (int i = count - 1; i >= 0; i--)修改
        {
            printf("%s", a[b[i]]);//printf("%d", a[b[i]]); 修改
            if (i != 0)
                printf(" ");
        }
        return 0;
    }
    
    

    再提供一个浓缩版的写法,供你参考:

    #include <stdio.h>
    int main()
    {
        int  i;
        char* num[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };
        char c[100] = { 0 };
        scanf("%s", c);
        for (i = 0; c[i] != '\0'; i++)
            printf(i == 0 && c[i] == '-' ? "fu" : i == 0 ? "%s" : " %s", num[c[i] - '0']);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月21日
  • 已采纳回答 8月13日
  • 创建了问题 8月13日

悬赏问题

  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装
  • ¥40 复杂的限制性的商函数处理