编程题:自守数和返回小于N的质数

前言

本文是关于编程题目的代码展示和解析,主要讲的就是自守数和返回小于N的质数两道题,会附带链接供大家尝试练习。

自守数

1、自守数是指一个数的平方的尾数等于该数自身的自然数。请求出n(包括n)以内的自守数的个数
例如: 25^2 = 625 , 76^2 = 5776 , 9376^2 = 87909376 。
输入描述:int型整数
输出描述:n以内自守数的数量。
OJ链接【牛客网题号: HJ99 自守数】【难度:中等】

解法1 >设置计数器,每遇到一个++

根据例子发现了个自守数的规律

例如:

25^2=625;625-25=600;600%100=0;25<100;

76^2=5776;5776-76=5700;5700%100=0;76<100;

9376^2=87909376;87909376-9376=87900000;87900000%10000=0;9376<10000;

自守数的平方再减去他本身之后,尾数就只剩下0了,这样求余大于他本身同时又最接近他的十百千万应该等于0

因此只要i从0开始试验,计算(i*i-i)%num是否为0,直到i=n

关键是num的取值,在i>=0&&i<10时num=10,在i<100时num=100,以此类推,在试验之前先判断x的取值

#include<stdio.h>
int main() {
	int n = 0;
	int cnt = 0;
	int num = 10;
	scanf("%d", &n);
	for (int i = 0; i <= n; i++) {//循环找自守数
		if (i >= num) {
			num *= 10;//判断x
		}
		if ((i * i - i) % num == 0) {//判断是否是自守数
			cnt++;
		}

	}
	printf("%d", cnt);
}
解法2 >分析得知自守数只有0,末尾为1,5 ,6会出现,统计分析是否为自守数
#include<stdio.h>
int main(){
    int n=0;
    while(scanf("%d",&n)!=EOF)
    {
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            if(i%10==1||i%10==5||i%10==6)
            //除了0,只有尾数为1 5 6可能是自守数
            {
                int temp1=i,temp2=i*i;
                while(temp1)//验证后几位
                {
                    if(temp2%10!=temp1%10) break; //不相等跳出
                    temp1/=10;   //相等分别除10,比较前一位
                    temp2/=10;
                }
                if(temp1==0) ans++;
            }
        }
        printf("%d",ans+1); //带上0
    }
    return 0;
}

返回小于N的质数

2、返回小于 N 的质数个数
输入描述:一个整数N
输出描述:小于N的质数数量
备注:0、1 不属于质数。
OJ链接【牛客网题号: OR86 返回小于 N 的质数个数】【难度:简单】

#include<stdbool.h>

bool is_prime(int n) {//判断是否是质数
    for (int i = 2; i < n; i++) {
    //与小于n的数字依次模运算,判断是否有因子
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

int main() {
    int n = 0;
    int count = 0;
    scanf("%d", &n);
    for (int i = 2; i < n; i++) {//循环找小于n的质数
        if (is_prime(i)) {
            count++;
        }
    }
    printf("%d", count);
}

总结

习题到这里就暂时告一段落,代码仅供参考,大家可以尝试点击链接去练习这两道编程题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翻转的乌龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值