独一无② 发表于 2015-11-29 12:52:52

输出与七有关的数

输入一个数N,输出不大于N的与七 有关的个数,如七的倍数,包含七数字的数
如 20 里有三个数,7,14,17.

#include <stdio.h>
int main()
{
    int i=0,n,j;
    scanf("%d",&n);
    for(j=7;j<=n;j++)
    {
            if(j/10==7 || j%10 == 7 || j%7 ==0)
              i++;
          
    }
    printf("%d\n",i);
    return 0;
}

我发现我的程序是有点问题的,并没有把所有的数都包含进去。如 170 这个数就不行。

0xcc 发表于 2015-11-29 12:52:53

独一无② 发表于 2015-11-29 15:01
if (j % 10 == 7)
                (*p)++;



这个意思是,如果这个数的个位是7,就让i加1,这里的*p就是i。
void seven(int *p, int j)//判断一个数中是否有某一位是数字7
{
        if (j % 10 == 7)//如果最后一位数字是7
                (*p)++;//i加1
        else if (j / 10 != 0)//如果最后一位数字不是7,就去掉最后一位数字,形成这个新的数,进入迭代计算
                seven(p, j / 10);
}
这个函数执行的效果就是,从这个数的最后一位开始遍历,遇到是7的位,就让i加1,并且函数执行结束;如果一直没有是7的位,就执行到最后,i没有变化,函数执行结束。

老师 发表于 2015-11-29 13:39:40

这一句是有问题的“if(j/10==7 || j%10 == 7 || j%7 ==0)”。也不是有问题就是逻辑上不对,170不满足所有的条件所以就没有咯。
只要把j/10改成j%10==0就可以了,记得采纳哦

独一无② 发表于 2015-11-29 14:21:11

老师 发表于 2015-11-29 13:39
这一句是有问题的“if(j/10==7 || j%10 == 7 || j%7 ==0)”。也不是有问题就是逻辑上不对,170不满足所有的 ...

j%10==0   那不是 180,190也符合了,但是事实上不行。

0xcc 发表于 2015-11-29 14:40:41

if判断的逻辑有漏洞,判断小于170的数是不会发现问题的,大于等于170之后就不准确了。
这是我改的代码:
#include<stdio.h>
void seven(int *p, int j)
{
        if (j % 10 == 7)
                (*p)++;
        else if (j / 10 != 0)
                seven(p, j / 10);
}
int main()
{
        int i = 0, j, n;
        int *p = &i;
        scanf("%d", &n);
        for (j = 7; j <= n; j++)
        {
                if (j % 7 == 0)
                        i++;
                else
                        seven(p, j);
        }
        printf("%d\n", i);
        return 0;
}

独一无② 发表于 2015-11-29 15:01:47

0xcc 发表于 2015-11-29 14:40
if判断的逻辑有漏洞,判断小于170的数是不会发现问题的,大于等于170之后就不准确了。
这是我改的代码:
...

if (j % 10 == 7)
                (*p)++;

这一步是什么意思? 看不懂

ravenhu13 发表于 2015-11-29 15:25:08

本帖最后由 ravenhu13 于 2015-11-29 15:30 编辑



#include <stdio.h>
int main()
{
        int i=0,n,j;
        int k;
        scanf("%d",&n);

        for(j=7;j<=n;j++)
        {
                //7的倍数打印出来
                if ((j/7)&&(j%7==0))
                {
                        printf("%d\n",j);
                }else
                {
                //包含7的数字
                        k = j;
                        for (i=10;k/i>0;i*=10)
                        {                               
                                if (((k/i)%i)==7)
                                {
                                        printf("%d\n",k);
                                }                               
                        }
                }
        }
        return 0;
}

ravenhu13 发表于 2015-11-29 15:26:50

这里我是输出所有有关7的数字,个数的你改改就可以了。

独一无② 发表于 2015-11-29 16:07:42

0xcc 发表于 2015-11-29 15:28
这个意思是,如果这个数的个位是7,就让i加1,这里的*p就是i。
void seven(int *p, int j)//判断一个数 ...

哦哦,现在懂了。谢谢了

爱,不解释 发表于 2016-4-1 15:51:17

还没懂
页: [1]
查看完整版本: 输出与七有关的数