鱼C论坛

 找回密码
 立即注册
查看: 9546|回复: 31

新手,c程序设计里的一个小题实在做不出来,求教。- -!

[复制链接]
发表于 2013-8-16 12:00:45 | 显示全部楼层 |阅读模式
4鱼币
本帖最后由 cwl胖胖 于 2013-8-17 09:56 编辑

题是这样的:
给一个不多于5位的正整数,要求:
1、求出它是几位数;
2、分别输出每一位数字;
3、按逆序输出各位数字,例如原数位321,应输出123.


十分感谢给位朋友的回答,你们是我学习的指路明灯。谢谢

最佳答案

查看完整内容

就你这个题目,不单独写子函数也可以,但分开写,你看得清楚一些,而且也不影响源数据。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-16 12:00:46 | 显示全部楼层
就你这个题目,不单独写子函数也可以,但分开写,你看得清楚一些,而且也不影响源数据。
  1. #include<stdio.h>

  2. //求位数函数,递归方法,当然也可以用while语句
  3. int fnum1(long m)
  4. {
  5.     if(m/10==0)
  6.                 return 1;
  7.         else
  8.                 return fnum1(m/10)+1;
  9. }

  10. //正序输出每一个数字,以逗号分隔;
  11. void fnum2(long m)
  12. {
  13.         int i;
  14.         int num=1;
  15.         int n=fnum1(m);
  16.         for(i=0;i<n-1;i++)
  17.                 num=num*10;
  18.         for(i=0;i<n;i++)
  19.         {
  20.                 printf("%d,",m/num);
  21.                 m=m%num;
  22.                 num=num/10;
  23.         }
  24. }

  25. //逆序输出每一个数字
  26. void fnum3(long m)
  27. {
  28.     int i=0;
  29.     do
  30.         {
  31.                 printf("%ld,",m%10);
  32.                 m=m/10;
  33.                 i++;
  34.         }while(m!=0);
  35. }

  36. int main()
  37. {
  38.     long x;
  39.     printf("请输入一个不超过五位数的整数。\n");
  40.     scanf("%ld",&x);
  41.     printf("你输入的是一个%d位数。\n",fnum1(x));
  42.         printf("正序输出为:\n");
  43.         fnum2(x);
  44.         printf("\n逆序输出为:\n");
  45.         fnum3(x);
  46.     getch();
  47.     return 0;
  48. }
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-16 13:10:27 | 显示全部楼层
用while做循环当i/10=0就终止,然后再用i%10来求个个数位的数,每进入一次循环就让变量加,累计进入循环次数就是位数,求个个数位的数逆序输出就很简单了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-16 13:14:31 | 显示全部楼层
本帖最后由 565123 于 2013-8-16 13:15 编辑
  1. #include <stdio.h>

  2. main()
  3. {
  4.         unsigned n, m, count = 1, wan, qian, bai, shi, ge;
  5.         printf("请输入一个不大于五位数的数字\n");
  6.         scanf("%d", &n);
  7.         //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  8.         m = n;
  9.         if (m == 0)
  10.                 count = 0;
  11.         else
  12.         {
  13.                 while (m / 10 != 0)
  14.                 {
  15.                         count++;
  16.                         m /= 10;
  17.                 }
  18.         }
  19.         printf("共%i位\n", count);
  20.         //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  21.         printf("万\t千\t百\t十\t个\n");
  22.         wan = n / 10000;
  23.         qian = n % 10000 / 1000;
  24.         bai = n % 1000 / 100;
  25.         shi = n % 100 / 10;
  26.         ge = n % 10;

  27.         printf("%d\t%d\t%d\t%d\t%d\n", wan, qian, bai, shi, ge);
  28.         //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  29.         printf("%d%d%d%d%d\n", ge, shi, bai, qian, wan);

  30.         return 0;
  31. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-16 14:24:29 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-16 14:25:21 | 显示全部楼层
tsembrace 发表于 2013-8-16 13:50
就你这个题目,不单独写子函数也可以,但分开写,你看得清楚一些,而且也不影响源数据。

首先,谢谢您的细心回答,十分感谢,我在看您的代码,有问题的话我给您留言。
谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-16 14:28:00 | 显示全部楼层
神的现身 发表于 2013-8-16 13:10
用while做循环当i/10=0就终止,然后再用i%10来求个个数位的数,每进入一次循环就让变量加,累计进入循环次数 ...

谢谢您的思路{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-16 15:02:32 | 显示全部楼层

您好,你的代码运行完全没问题,我也能看懂,就是有两个问题:
1、既然要求的是正数,是不是就不用m==0了呢?也就是 10和11行可以省略呢?
2、 为什么要用m=n(第9行),这个什么意义,为什么不用直接用n呢?为什么要把n的值赋给m呢?
我试着直接用n运行程序,第一个位数的照样正常,后面两个问题就没法运行了。
这是为什么呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-16 15:14:05 | 显示全部楼层
tsembrace 发表于 2013-8-16 13:50
就你这个题目,不单独写子函数也可以,但分开写,你看得清楚一些,而且也不影响源数据。

你好,说实话,你的代码我运行了确实很正确,只是第50行程序报错,把它注解了就没事了。
能麻烦您给我大体解释一些程序的意思吗?还有点个人学习问题,想请教您,刚看到您在我另一个问题额回答了。谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-16 15:15:49 | 显示全部楼层
tsembrace 发表于 2013-8-16 13:50
就你这个题目,不单独写子函数也可以,但分开写,你看得清楚一些,而且也不影响源数据。

能帮我看下您上面的那个回答吗?
为什么要用m=n(第9行),这个什么意义,为什么不用直接用n呢?为什么要把n的值赋给m呢?
我试着直接用n运行程序,第一个位数的照样正常,后面两个问题就没法运行了。
这是为什么呢?  
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-16 15:21:22 | 显示全部楼层
cwl胖胖 发表于 2013-8-16 15:02
您好,你的代码运行完全没问题,我也能看懂,就是有两个问题:
1、既然要求的是正数,是不是就不用m==0了 ...

对于数字0来说,位数就是1.
所以我也认为3楼的10、11行是多余的。如果要契合你题意的“正整数要求”,可以在scanf之后判断输入是否为正,在输入为正后再判断位数。但对你这题来说,这都属于很小的事情,甚至不算问题,题意更重要的在于算法。
你的第2个问题,为什么要多用一个m,因为17行的代码,在计算位数时会影响到原来的数据。这也就是为什么你直接用n运行,后两个要求无法运行的原因。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-16 15:23:40 | 显示全部楼层
有想法吗?咱先别说怎么编程。有想法就把想法发出来,大家讨论。学着把问题细化。然后哪个知识点不会,再来问。这样才进步的快。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-16 15:41:39 | 显示全部楼层
tsembrace 发表于 2013-8-16 15:21
对于数字0来说,位数就是1.
所以我也认为3楼的10、11行是多余的。如果要契合你题意的“正整数要求”,可 ...

这样啊,原来会改变原来的数值啊,哦  懂了懂了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-16 15:42:35 | 显示全部楼层
  1. #include<stdio.h>
  2. void main()
  3. {
  4.         int i, j, k, l,q;
  5.         int s[5];
  6. s:        k = 0;
  7.         l = 0;
  8.         q = 0;
  9.         printf("请输入一个数:");
  10.         scanf("%d",&i);
  11.         while(i != 0)//只要 i不等于 0 就
  12.         {
  13.                 j = i % 10;//取到i 的个位
  14.                 s[q]=j;//放入数组
  15.                 q++;//下标自增
  16.                 k = k * 10 + j;//k原先等于0第一次就是等于个位 第二次 = 个位 * 10 + 十位....你懂得
  17.                 i = i / 10;//把各位去掉 下次可以取这个数的个位就相当于输入数的十位.....
  18.                 l++;//位数自增记录该数是几位
  19.         }
  20.         if(l<=5)//如果是一个5位以内的数
  21.         {
  22.         printf("该数是%d位数\n",l);
  23.         for(i = q-1;i>=0;--i)//应为数组中的数是从各位开始放的所以从后往前输出
  24.         {
  25.                 printf("%d\n",s[i]);
  26.         }
  27.         printf("该数倒置后是:%d\n",k);
  28.         }
  29.         else
  30.         {
  31.                 printf("你的输入不合法!请重新输入!\n");//如果不是五位之内的就报错
  32.                 goto s;
  33.         }
  34.        
  35. }
复制代码
不懂可以追问申请最佳啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-16 15:42:54 | 显示全部楼层
本帖最后由 苹果沃珂 于 2013-8-16 15:46 编辑

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
        int val;
        printf("输入一个整数:");
        scanf("%d",&val);
        
        char str[10]; //用来存放输入整数转换后的字符串  最大位数为10-1
        int len ;  //用来存放输入整数转换后的字符串的长度==位数
        char kk[10];  //用来存放倒序输出字符串

        itoa(val,str,10); //将一个整数转换成字符串   需要#include <stdlib.h>
        len = strlen(str); //计算一个字符串的长度  == 位数  需要#include <string.h>
        for (int i=0; i<len; i++)
        {
                kk = str[len-1-i]; //将str字符串中前len个字符倒序输出,保存到kk中
        }
        kk[len] = str[len];  // 复制字符串结束标志"\0"

        printf("您输入的整数是 %d,位数是 %d,倒序为%s",val,len, kk);
        return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-16 16:10:38 | 显示全部楼层
牡丹花下死做鬼 发表于 2013-8-16 15:42
不懂可以追问申请最佳啊

呵呵 ,你好。想问下23,25,27三句话的意思。
是不是首先看 i =q - 1,如果成立就执行 i>=0,再成立就执行25行的printf语句,输出以 i 为下标的数组里的数,然后执行 --i,完成第一个循环。
第二个循环,先执行 i>=0,进行判断,如果成立再次执行printf,然后执行 --i,
直到 i>=0不成立
不成立后就执行27行的,printf语句,输出k   , 是不是这个顺序?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-16 16:11:34 | 显示全部楼层
本帖最后由 tsembrace 于 2013-8-16 16:19 编辑
cwl胖胖 发表于 2013-8-16 15:14
你好,说实话,你的代码我运行了确实很正确,只是第50行程序报错,把它注解了就没事了。
能麻烦您给我大 ...

一、求位数
之前用的是递归,如果你了解递归的话,上面的代码就很好理解。这里我说一下while的方法
先说下方法:第一次用原数字先除以10,若商不为0,则继续第二次,用上一次的商继续除以10;依次进行下去,直至商为0。通过进行的次数可以计算出位数,比如123这个三位数,第一次:123先除以10,商为12,不为0继续;第二次:12除以10,商为1不为0,继续;第三次:1除以10,商为0,则终止,总共三次,说明位数也为3.这里用的do{}while;是更好地匹配上面的解释。如果用while{}语句的话,i初始就要设为1.int fnum1(long m)
{
    int i=0;
    do
    {
        i++;
       m=m/10;
    }while(m!=0);
    return i;
}  //为啥这里代码老贴不上呢。。。
二、正序显示
比如一个数字为123,要依次输出各位数字,首先能想到的就是:第一步先用123除以100,得出商为1,余数为23;第二步用上步余数23除以10,商为2,余数为3;第三步用上步余数3除以1,商为3。第一步的被除数是原数,除数可以通过10的位数次幂求得。接下来每一步的被除数都是上步的余数,除数都是上一步除数除以10.每一步都打印输出商,则可正序显示。
  1. void fnum2(long m)
  2. {
  3.         int i;
  4.         int num=1;
  5.         int n=fnum1(m);    //求位数
  6.         for(i=0;i<n-1;i++)
  7.                 num=num*10;      //设置下面第一步的除数
  8.         for(i=0;i<n;i++)
  9.         {
  10.                 printf("%d,",m/num);   //输出每一步的商
  11.                 m=m%num;        //更新下一步的被除数
  12.                 num=num/10;     //更新下一步的除数
  13.         }
  14. }
复制代码
逆序的是每一步输出余数,你如果弄清楚上面的正序,逆序结合代码来看也就没有问题。
另外,如果你了解递归,这里正序显示的方法就很容易,但如果还没接触递归,就看上面的两个代码就可以。
  1. void fnum2_digui(long m)
  2. {
  3.         if(fnum1(m)==1)
  4.                 printf("%ld",m);
  5.         else
  6.         {
  7.                 fnum2_digui(m/10);
  8.                 printf("%ld",m%10);
  9.         }
  10. }
复制代码





小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-16 16:12:13 | 显示全部楼层
苹果沃珂 发表于 2013-8-16 15:42
#include
#include
#include

谢谢您的回答
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-16 16:13:54 | 显示全部楼层
cwl胖胖 发表于 2013-8-16 16:10
呵呵 ,你好。想问下23,25,27三句话的意思。
是不是首先看 i =q - 1,如果成立就执行 i>=0,再成立就执行 ...

    你说的很对啊 (*^__^*) 嘻嘻…… 加油啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-16 16:14:20 | 显示全部楼层
牡丹花下死做鬼 发表于 2013-8-16 15:42
不懂可以追问申请最佳啊

27行可以输出k  是不是因为通过23和25的命令,使s[ j ]变成了s[ i ],并且 i 和 j 的顺序正好相反
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-17 20:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表