初学者C语言进阶经典题(必刷)

本文介绍了几个编程题目,涉及算法设计与分析,如寻找孪生素数(因子之和相等的数对)、生成n阶螺旋数组、输出可逆素数、检测对称数以及大数阶乘的计算。展示了C语言实现的代码片段及其应用.
摘要由CSDN通过智能技术生成

复习算法设计与分析

T1孪生数(本质:((A因子之和)的因子之和)==A)(A的因子之和等于B,B的因子之和等于A)

给定搜索范围m和n,(1<=m<n<=20000),求指定范围内的孪生数。

#include<stdio.h>
void istwins(int m,int n)
{
	int i,j,s,a[20000]; //构造a[i]数组存放满足条件的相应的i的因子之和
	for(i=m;i<=n;i++)
	   a[i]=0;
	for(i=m;i<=n;i++)
	{
		s=0;             //i的因子之和s
		for(j=1;j<i;j++)
			if(i%j==0) s+=j;
		if(s>=m&&s<=n&&s!=i) //判断因子之和是否在给定范围中
			a[i]=s;
	}
	for(i=m;i<=n;i++)
		if(i==a[a[i]])
		{
			printf("%d %d\n",i,a[i]);
			a[a[i]]=0;       //重点,避免重复比较和输出(请读者思考)
		}
}

main()
{
	int n,m;
	scanf("%d%d",&m,&n);
	istwins(m,n);
}

运行结果

输入:100 300

输出:220 284

T2输出n阶螺旋阵

#include <stdio.h>
void spiralsquare(int n)
{
	int i,j,a[100][100],k=1;
	for(i=0;i<n/2;i++)           //i控制外层循环即全书
	{
		for(j=i;j<=n-2-i;j++)    //j控制行列变换,将每圈中一侧的数据存入数组中
			a[i][j]=k++;
		for(j=i;j<=n-2-i;j++)
			a[j][n-1-i]=k++;
		for(j=n-1-i;j>=i+1;j--)
			a[n-1-i][j]=k++;
		for(j=n-1-i;j>=i+1;j--)
			a[j][i]=k++;
	}
	if(n%2==1)   //若为奇数阶方阵,最中心数据通过下标给定
	{
		i=n/2;
		a[i][i]=n*n;
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
			printf("%3d",a[i][j]);
		printf("\n");
	}
}

main()
{
	int n;
	scanf("%d",&n);
	spiralsquare(n);
}

T3输出1000至10000之内的可逆素数

#include <stdio.h>
#include <math.h>

int reverse(int n) { // 反序函数
    int r = 0;
    while (n) {
        r = r * 10 + n % 10;
        n /= 10;
    }
    return r;
}

int isPrime(int n) { // 判断素数函数
    if (n < 2) {
        return 0;
    }
    for (int i = 2; i <= sqrt(n); i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}

int main() {
    printf("1000到10000之间的可逆素数有:\n");
    for (int i = 1000; i <= 10000; i++) {
        if (isPrime(i) && isPrime(reverse(i))) {
            printf("%d ", i);
        }
    }
    printf("\n");
    return 0;
}

T4两个数只差为2的素数,称为孪生素数。试着输出5组孪生素数。

#include <stdio.h>
#include <stdbool.h>

bool isPrime(int num) {
    if (num <= 1) {
        return false;
    }
    for (int i = 2; i * i <= num; i++) {
        if (num % i == 0) {
            return false;
        }
    }
    return true;
}

int main() {
    int count = 0;
    int num = 3;
    while (count < 5) {
        if (isPrime(num) && isPrime(num + 2)) {
            printf("(%d, %d)\n", num, num + 2);
            count++;
        }
        num++;
    }
    return 0;
}

T5输出1000至10000之内的对称数,并输出对称数的个数(3种解法)

#include <stdio.h>
#include <string.h>

int main()
{
    int count = 0;
    for(int i = 1000; i <= 10000; i++)
    {
        char str[10];
        sprintf(str, "%d", i); // 将整数转换为字符串
        int len = strlen(str);
        int flag = 1;
        for(int j = 0; j < len/2; j++)
        {
            if(str[j] != str[len-j-1]) // 判断是否对称
            {
                flag = 0;
                break;
            }
        }
        if(flag == 1) // 如果是对称数,则输出
        {
            printf("%d ", i);
            count++;
        }
    }
    printf("\n一共有%d个对称数\n", count);
    return 0;
}
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int count = 0;
    for (int i = 1000; i <= 10000; i++)
    {
        int a = i % 10;     // 个位数
        int b = i / 10 % 10;    // 十位数
        int c = i / 100 % 10;   // 百位数
        int d = i / 1000;   // 千位数
        if (a == d && b == c)
        {
            printf("%d ", i);
            count++;
        }
    }
    printf("\n对称数的个数为%d\n", count);
    return 0;
}
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int count = 0;
    for (int i = 1000; i <= 10000; i++)
    {
        int x = i, y = 0;
        while (x > 0)
        {
            y = y * 10 + x % 10;
            x /= 10;
        }
        if (y == i)
        {
            printf("%d ", i);
            count++;
        }
    }
    printf("\n对称数的个数为%d\n", count);
    return 0;
}

T6大数阶乘

#include <stdio.h>        
#include <stdlib.h>
#include <math.h>
void fac(int n)
{
    int long a[256],b,d;
    int m,i,j;
    m=100;
    a[1]=1;
    for(i=2;i<=m;i++)
        a[i]=0;
    d=0;
    for(i=2;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            b=a[j]*i+d;
            a[j]=b%1000000;
            d=b/1000000;
        }
    }
    for(i=m;a[i]==0;i--) ;
    printf("%ld!=",n);
    printf("%ld",a[i]);
    for(j=i-1;j>=1;j--)
    {
        if(a[j]>99999)
            printf("%ld ",a[j]);
        else if(a[j]>9999)
            printf("%0ld ",a[j]);
        else if(a[j]>999)
            printf("%00ld ",a[j]);
        else if(a[j]>99)
            printf("%000ld ",a[j]);
        else if(a[j]>9)
            printf("%0000ld ",a[j]);
        else
            printf("%00000ld ",a[j]);
    }
    printf("\n");
}

 优化

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void fac(int n)
{
    int long a[256],b,d;
    int m,i,j;
    m=1;
    a[1]=1;
    for(i=2;i<=m;i++)
        a[i]=0;
    for(i=2;i<=n;i++)
    {
         d=0;
        for(j=1;j<=m;j++)
        {
            b=a[j]*i+d;
            a[j]=b%1000000;
            d=b/1000000;
        }
        //if(d!=0) {a[j]=d;m=m+1;}
        if(d!=0) {m=m+1;a[m]=d;}
    }
 
    printf("%ld!=",n);
    printf("%ld ",a[m]);
    for(j=m-1;j>=1;j--)
 
        if(a[j]>99999)
            printf("%ld ",a[j]);                              
        else if(a[j]>9999)                                                                            
            printf("0%ld ",a[j]);
        else if(a[j]>999)                                 
            printf("00%ld ",a[j]);
        else if(a[j]>99)
            printf("000%ld ",a[j]);
        else if(a[j]>9)
            printf("0000%ld ",a[j]);
        else
            printf("00000%ld ",a[j]);
 
    printf("\n");
}
 
void main()
{
    int n;
    printf("input a number:");
    scanf("%d",&n);
    fac(n);
}

未完待续......

  • 14
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值