C语言编程 菜鸟练习100题(31-40)

【练习31】判断质数

0. 题目:
判断质数
1. 分析:
质数(prime number),指大于 1的、且除 1 和本身以外没有其他因数的自然数。
2. 程序:

#include <stdio.h> 
#include<math.h>
int main()
{
    int i, iNum, iFlag = 0;
 
    printf("输入一个正整数: ");
    scanf("%d",&iNum);
 
    for(i=2; i<=sqrt(iNum); i++)
    {
        if(iNum%i==0) // 能被其它数整除则不是质数 
        {
            iFlag=1;
            break;
        }
    }
 
    if (iFlag==0)
        printf("%d 是素数",iNum);
    else
        printf("%d 不是素数",iNum);
    
    return 0;
}

3. 输入输出:

输入一个正整数: 123457
123457 是素数


【练习32】判断Armstrong数

0. 题目:
判断Armstrong数(阿姆斯壮数)
1. 分析:
Armstrong 数是指 n位数的各位数的 n次方之和等于该数。例如:153=13+53+3^3。
练习使用函数调用。函数调用就是使用已经定义好的函数。创建 C 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。
2. 程序:

#include <stdio.h>
#include <math.h>
 
int checkArmstrongNumber(int n); // 函数声明,名称、返回类型和参数
 
int main()
{
    int n, flag;
 
    printf("输入正整数: ");
    scanf("%d", &n);
 
    // 检测 Armstrong 数
    flag = checkArmstrongNumber(n);
    if (flag == 1)
        printf("%d 是 Armstrong 数。", n);
    else
        printf("%d 不是 Armstrong 数。",n);
    return 0;
}

int checkArmstrongNumber(int number)
{
    int originalNumber, remainder, result = 0, n = 0, flag;
 
    originalNumber = number; 
    while (originalNumber != 0)  // 判断位数 
    {
        originalNumber /= 10;
        n++;
    }
 
    originalNumber = number; 
    while (originalNumber != 0)  
    {
        remainder = originalNumber%10;
        result += pow(remainder, n);
        originalNumber /= 10;
    }
 
    // 判断 Armstrong 数条件
    if(result == number)
        flag = 1;
    else
        flag = 0;
 
    return flag;
}

3. 输入输出:

输入三位数: 370
370 是 Armstrong 数。


【练习33】求整数的所有因数

0. 题目:
求一个整数的所有因数
1. 分析:
如果整数 a 除以整数 b(b≠0) 的商正好是整数而没有余数, 就说 b 是 a 的因数。因数包括 1和自身。
2. 程序:

#include <stdio.h> 
int main()
{
    int iNum, i;
 
    printf("输入一个整数: ");
    scanf("%d",&iNum);
 
    printf("%d 的因数有: ", iNum);
    for(i=1; i <= iNum; i++)
    {
        if (iNum%i == 0)
        {
            printf("%d ",i);
        }
    }
 
    return 0;
}

3. 输入输出:

输入一个整数: 60
60 的因数有: 1 2 3 4 5 6 10 12 15 20 30 60


【练习34】创建三角形图案

0. 题目:
创建三角形图案
1. 分析:
练习使用 for 循环结构。for 循环允许一个执行指定次数的循环控制结构。
2. 程序:

#include <stdio.h> 
int main()
{
    int i, j, k, rows, space;
 
    printf("输入行数: ");
    scanf("%d",&rows);
 
    // 打印 * 三角形 
    for(i=1; i<=rows; i++)
    {
        for(j=1; j<=i; j++)
        {
            printf("* ");
        }
        printf("\n");
    }
    
    // 打印 * 倒三角形    
    printf("\n\n");
    for(i=rows; i>=1; i--)
    {
        for(j=1; j<=i; j++)
        {
            printf("* ");
        }
        printf("\n");
    }
    
    // 打印 * 金字塔三角形 
    printf("\n\n");
    for(i=1; i<=rows; i++, k=0)
    {
        for(space=1; space<=rows-i; space++)
        {
            printf("  ");
        }
 
        while(k != 2*i-1)
        {
            printf("* ");
            k++;
        }
 
        printf("\n");
    }
    
    // 打印弗洛伊德三角形
    printf("\n\n");
    for(i=1,j=1;i<=rows;i++) 
    { 
        for(k=1;k<=i;k++,j++) 
            printf("%5d",j); 
        printf("\n"); 
    } 
    
    return 0;
}

3. 输入输出:

输入行数: 6
前 3 个图略
弗洛伊德三角形的输出如下:
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
16 17 18 19 20 21


【练习35】表格形式输出数据

0. 题目:
表格形式输出数据: 将 1~100 的数据以 10x10 矩阵格式输出。
1. 分析:
练习使用 for 循环结构。for 循环允许一个执行指定次数的循环控制结构。
2. 程序:

#include <stdio.h>
 
int main() {
   int i, j, count;
 
   for(i = 1; i <= 10; i++) {
      for(j = i; j <=100; j += 10 )
         printf(" %3d", j);
       printf("\n");
   }
 
   return 0;
}

3. 输入输出:

1  11  21  31  41  51  61  71  81  91
2  12  22  32  42  52  62  72  82  92
3  13  23  33  43  53  63  73  83  93
4  14  24  34  44  54  64  74  84  94
5  15  25  35  45  55  65  75  85  95
6  16  26  36  46  56  66  76  86  96
7  17  27  37  47  57  67  77  87  97
8  18  28  38  48  58  68  78  88  98
9  19  29  39  49  59  69  79  89  99
10  20  30  40  50  60  70  80  90 100

【练习36】实现简单的计算器

0. 题目:
实现简单的计算器
1. 分析:
实现加减乘除计算。
2. 程序:

# include <stdio.h>
int main()
{ 
    char cOperator;
    float fNum1, fNum2;
 
    printf("输入操作符 (+, -, *, /): ");
    scanf("%c", &cOperator);
 
    printf("输入两个数字(逗号分隔): ");
    scanf("%f,%f",&fNum1, &fNum2);
 
    switch(cOperator)
    {
        case '+':
            printf("%.1f + %.1f = %.1f", fNum1, fNum2, fNum1 + fNum2);
            break;
        case '-':
            printf("%.1f - %.1f = %.1f", fNum1, fNum2, fNum1 - fNum2);
            break; 
        case '*':
            printf("%.1f * %.1f = %.1f", fNum1, fNum2, fNum1 * fNum2);
            break; 
        case '/':
            printf("%.1f / %.1f = %.1f", fNum1, fNum2, fNum1 / fNum2);
            break; 
        // operator doesn't match any case constant (+, -, *, /)
        default:
            printf("Error! operator is not correct");
    }
    
    return 0;
}

3. 输入输出:

输入操作符 (+, -, *,/): /
输入两个数字(逗号分隔): 1.2,2.0
1.2 / 2.0 = 0.6

【练习37】计算一个数是否可为两个素数之和

0. 题目:
计算一个数是否可为两个素数之和
1. 分析:
练习使用 for 循环结构。for 循环允许一个执行指定次数的循环控制结构。
2. 程序:

#include <stdio.h>
 
int checkPrime(int n);
int main()
{
    int num, i, flag = 0;
 
    printf("输入正整数: ");
    scanf("%d", &num);
 
    for(i = 2; i <= num/2; ++i)
    {
        // 检测判断
        if (checkPrime(i) == 1)
        {
            if (checkPrime(num-i) == 1)
            {
                printf("%d = %d + %d\n", num, i, num-i);
                flag = 1;
            } 
        }
    }
 
    if (flag == 0)
        printf("%d 不能分解为两个素数。", num);
 
    return 0;
}
 
// 判断素数
int checkPrime(int n)
{
    int i, isPrime = 1;
 
    for(i = 2; i <= n/2; ++i)
    {
        if(n % i == 0)
        {
            isPrime = 0;
            break;
        }  
    }
 
    return isPrime;
}

3. 输入输出:

输入正整数: 34
34 = 3 + 31
34 = 5 + 29
34 = 11 + 23
34 = 17 + 17


【练习38】二进制转与十进制相互转换

0. 题目:
二进制转与十进制相互转换
1. 分析:
2. 程序:

#include <stdio.h>
#include <math.h>
 
int convertBinaryToDecimal(long long nBinary);
long long convertDecimalToBinary(int nDecimal);

 
int main()
{
	char cFlag; 
	int nDecimal;
    long long nBinary;
    
    printf("B:将二进制数转换为十进制\n");
    printf("D:将十进制数转换为二进制\n");
    printf("请输入 B 或 D:\n");
    scanf("%c", &cFlag);

	if (cFlag=='B' || cFlag=='b')
	{
		printf("输入一个二进制数: ");
        scanf("%lld", &nBinary);
        nDecimal = convertBinaryToDecimal(nBinary);
        printf("二进制数 %lld 转换为十进制为 %d", 
		nBinary, nDecimal);
	}
	else if (cFlag=='D' || cFlag=='d')
	{
		printf("输入一个十进制数(<1024): ");
    	scanf("%d", &nDecimal);
    	nBinary = convertDecimalToBinary(nDecimal);
        printf("十进制数 %d 转换为二进制位 %lld", nDecimal, nBinary);
	}
	else
	{
		printf("输入错误。");
	}	
	
    return 0;
}
 
int convertBinaryToDecimal(long long nBinary)
{
    int decimalNumber = 0, i = 0, remainder;
    while (nBinary!=0)
    {
        remainder = nBinary%10;
        nBinary /= 10;
        decimalNumber += remainder*pow(2,i);
        ++i;
    }
    return decimalNumber;
}

long long convertDecimalToBinary(int nDecimal)
{
    long long binaryNumber = 0;
    int remainder, i = 1, step = 1;
 
    while (nDecimal!=0)
    {
        remainder = nDecimal%2;
        printf("Step %d: %d/2, 余数 = %d, 商 = %d\n", step++, nDecimal, remainder, nDecimal/2);
        nDecimal /= 2;
        binaryNumber += remainder*i;
        i *= 10;
    }
    return binaryNumber;
}

3. 输入输出:

B:将二进制数转换为十进制
D:将十进制数转换为二进制
请输入 B 或 D:
B
输入一个二进制数: 110110111
二进制数 110110111 转换为十进制为 439
D
输入一个十进制数(<1024): 100
Step 1: 100/2, 余数 = 0, 商 = 50
Step 2: 50/2, 余数 = 0, 商 = 25
Step 3: 25/2, 余数 = 1, 商 = 12
Step 4: 12/2, 余数 = 0, 商 = 6
Step 5: 6/2, 余数 = 0, 商 = 3
Step 6: 3/2, 余数 = 1, 商 = 1
Step 7: 1/2, 余数 = 1, 商 = 0
十进制数 100 转换为二进制位 1100100


【练习39】八进制与十进制相互转换

0. 题目:
八进制与十进制相互转换
1. 分析:
2. 程序:

#include <stdio.h>
#include <math.h>
 
int convertDecimalToOctal(int decimalNumber);
int main()
{
    int decimalNumber;
 
    printf("输入一个十进制数: ");
    scanf("%d", &decimalNumber);
 
    printf("十进制数 %d 转换为八进制为 %d", decimalNumber, convertDecimalToOctal(decimalNumber));
 
    return 0;
}
 
int convertDecimalToOctal(int decimalNumber)
{
    int octalNumber = 0, i = 1;
 
    while (decimalNumber != 0)
    {
        octalNumber += (decimalNumber % 8) * i;
        decimalNumber /= 8;
        i *= 10;
    }
 
    return octalNumber;
}

3. 输入输出:

输入一个十进制数: 1024
十进制数 1024 转换为十进制为 2000


【练习40】八进制与二进制相互转换

0. 题目:
八进制与二进制相互转换。
1. 分析:
2. 程序:

#include <stdio.h>
#include <math.h>
 
int convertBinarytoOctal(long long binaryNumber);
int main()
{
    long long binaryNumber;
 
    printf("输入一个二进制数: ");
    scanf("%lld", &binaryNumber);
 
    printf("二进制数 %lld 转换为八进制为 %d", binaryNumber, convertBinarytoOctal(binaryNumber));
 
    return 0;
}
 
int convertBinarytoOctal(long long binaryNumber)
{
    int octalNumber = 0, decimalNumber = 0, i = 0;
 
    while(binaryNumber != 0)
    {
        decimalNumber += (binaryNumber%10) * pow(2,i);
        ++i;
        binaryNumber/=10;
    }
 
    i = 1;
 
    while (decimalNumber != 0)
    {
        octalNumber += (decimalNumber % 8) * i;
        decimalNumber /= 8;
        i *= 10;
    }
 
    return octalNumber;
}

3. 输入输出:

输入一个二进制数: 10101100
二进制数 10101100 转换为八进制为 254


版权说明:
题目和例程 源于 菜鸟教程,作者重新编写了程序、注释和算例,并增加了难点分析。

posted @ 2021-04-12 15:41  youcans  阅读(745)  评论(0编辑  收藏  举报