Skip to content

Latest commit

 

History

History
193 lines (137 loc) · 4.41 KB

整数趣题.md

File metadata and controls

193 lines (137 loc) · 4.41 KB

《C语言趣味程序百例精解》读书笔记——第三章 整数趣题1

1.有限5位数

题目:个位数为6且能被3整除的五位数共有多少?

#include <stdio.h>

int main()
{
    int i;
    int count = 0;  //计数

    for(i = 1000; i <= 9999; i++)
        if(!(( i * 10 + 6) % 3) )  //判断所选的数能否被3整除
            count++;
    printf("count = %d\n", count);

    return 0;
}

说明:满足条件的五位数的选择范围是10006、10016、...、99996。可设基础数i=1000,通过计算i*10+6即可得到欲选的数(i的变化范围是1000~9999),再判断该数能否被3整除。

思考题:求100到1000之间有多少个其数字之和为5的整数。

//思考题:求100到1000之间有多少个其数字之和为5的整数。

#include <stdio.h>

int main()
{
    int i, j, k;
    int count = 0;

    for(i = 1; i <= 5; i++)
        for(j = 0; j <= 5; j++)
            for(k = 0; k <= 5; k++)
            {
                if( i + j + k == 5)
                    count++;
            }
    printf("count = %d\n",count);

    return 0;
}

2. 8除不尽的自然数

题目:一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。又知这个自然数被17除余 4,所得的商被17除余15,最后得到一个商是a的2 倍。求这个自然数。

据题意,可设最后的商为i(i从1开始取值),用逆推法可以列出关系式:

(((i*8+7)*8)+1)*8+1=((2*i*17)+15)*18+4

再用试探法求出商i的值。

代码如下:

#include <stdio.h>

int main()
{
    int  x;

    for(x = 1; ; x++) // 使探商的值
    {
        if((( x * 8 + 7) * 8 + 1) * 8 + 1 == (( 2 * x * 17) + 15) * 17 + 4 )
        {
            printf("The required number is:%d\n",(( x * 8 + 7) * 8 + 1));
            break; //找到之后,退出循环。
        }
    }

    return 0;
}

再用试探法求出商i的值。

3.一个奇异的三位数

题目:一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码顺序正好相反,求这个三位数。

据题意可知,七进制和九进制表示的这个自然数的每一位一定小于7,可设其七进制数形式为kji,(i、i、k的取值分别为1~6),然后设其九进制表示形式为ijk。

代码如下:

#include <stdio.h>

int main()
{
    int i,j,k;

    //使用穷举法
    for( i = 1; i < 7; i++)  //穷举9进制的第一位数字
        for( j = 0; j < 7; j++) //穷举9进制的第二位数字
            for( k = 1; k < 7; k++) //穷举9进制的第三位数字
                if(i * 9 * 9 + j * 9 + k == i + j * 7 + k * 7 * 7)
                {
                    printf("The special number with 3 digits is:");
                    printf("%d%d%d(7)=%d%d%d(9)=%d(10)\n",k,j,i,i,j,k,i*9*9+j*9+k);
                } 
    return 0;
}

第二种方法:

#include <stdio.h>

int main()
{
    int num,n1;
    int i, s;

    for(num = 100; num < 1000; num++)
    {
        n1 = num; s = 0;
        while(n1)
        {
            i = n1 % 7;
            s = s * 9 + i;
            n1 /= 7;
        }

        if (num == s)
            printf("%d\n",s);
    }

    return 0;
}

4. 4位反序数

题目:设N是一个四位数,它的9倍恰好是其反序数,求N。反序数就是将整数的数字倒过来形成的整数。例如:1234的反序数是4321。

#include <stdio.h>

int main(void)
{
    int i;

    for(i = 1000; i <= 1111; i++)  //穷举4位数可能的值
    {
        if( i%10*1000 + i/10%10*100 + i/100%10*10 +i/1000 == i*9) //判断反序数是否是原整数的9倍
            printf("The number:%d\n",i);
    }

    return 0;
}

第二种方法:

#include <stdio.h>

int main()
{
    int i,j,k,n;

    for(i = 1; i <= 9; i++)
        for(j = 0; j <= 9; j++)
            for(k = 0; k <= 9; k++)
                for(n = 1; n <= 9; n++)
                {
                    int n1 = i * 1000 + j * 100 + k * 10 + n;
                    if ( 9 * n1 == n * 1000 + k * 100 + j * 10 + i)
                        printf("%d", n1);
                }
    return 0;
}